如果为"三个实例",则删除行



我有一个包含四行的列表:

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

最新更新