我有一个包含四行的列表:
file1.text
A_1_2
A_2_3
A_3_4
B_1_2
B_2_3
B_3_4
然后我找到了所有可能的组合,每条线最多4个,例如:
file2.txt
A_1_2 A_2_3 A_3_4 A_3_4
A_1_2 A_2_3 B_1_2 B_2_3
我想做的是,如果有3个实例包含A
,那么删除行:
output.txt
A_1_2 A_2_3 B_1_2 B_2_3
我该怎么做?我知道有些命令使用两个唯一的字符串,但这些字符串对我不起作用。如果需要,请告诉我如何使问题变得更好。提前感谢!
awk
提供了一种简单的方法来检查是否有三个或更多以'A'
开头的字段。您可以简单地在file2.txt
的每一行中的四个字段中的每一个字段上循环,并使用substr()
检查每个字段的第一个字符。每次遇到"A"
时保留一个计数器,如果计数器达到3
,则跳过该行,例如
awk '{n=0; for(i=1;i<=NF;i++) if(substr($i,1,1)=="A" && ++n==3) next }1' file2.txt
使用file2.txt
作为输入文件,您将收到输出:
A_1_2 A_2_3 B_1_2 B_2_3
您可以在GNU Awk-String Manipulation Functions一节中详细阅读substr()
函数。命令末尾的1
只是默认操作print
的简写,用于打印未跳过的行。如果你还有其他问题,或者我误解了你的问题,请告诉我。
在普通bash
:中
#!/bin/bash
while read -r line; do
[[ $line =~ A.* A.* A ]] || printf "%sn" "$line"
done < file2.txt
或者,使用grep
:
grep -Ev '(^| )A.* A.* A' file2.txt