awk 过滤仅包含单个字母的行

awk 过滤仅包含单个字母的行

我有一个文件(file1),如下所示:

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 2 AA 234 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ROW 3 AA 122 XXXXXXXXXXXXXXXXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...

有多个行包含不同数量的 X。但是,结果不应该包含仅由 X 组成的行,它应该是:

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...

感谢您的帮助!

答案1

使用awk,打印最后一个字段至少有一个字符而不是 的行X

awk '$NF ~ /[^X]/' file

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY

或者与grep

grep -v '[[:space:]]XX*$' file

答案2

使用标准删除仅在末尾sed包含空格的所有行:X

sed '/ X\{1,\}$/d' file

或者,

sed '/ XX*$/d' file

如果给定选项,则可以sed理解扩展正则表达式-E

sed -E '/ X+$/d' file

如果文件中的分隔符不是空格而是制表符,则使用它[[:blank:]]来代替表达式中的初始空格。

对于上面(和下面)的每个sed '/RE/d'变体,等效grep命令是grep -v 'RE',例如

grep -v ' X\{1,\}$' file

相当于

sed '/ X\{1,\}$/d' file

删除仅包含以下副本的行任何末尾有单个字符:

sed '/ \(.\)\1*$/d' file

这匹配一个空格,后跟某个字符,然后是零个或多个该特定字符到行尾。匹配的行被删除。

只是使用相同的想法,以下内容将删除末尾仅包含重复序列(例如ABCABCor )的行:ABABABAB

sed '/ \(..*\)\1\1*$/d' file

答案3

要检查每个字段而不仅仅是最后一个字段,您可以执行以下操作:

awk -F'(^|[\t ]+)X+([\t ]+|$)' 'NF==1' infile

或使用循环显式检查每个字段:

awk '{ for(i=1; i<=NF; i++) if($i ~/^X+$/)next };1' infile

或者使用 sub() 函数并借助字边界(GNU awk?):

awk '{ bkp=$0; if(! sub("\\<X+\\>", "")) print bkp }' infile

答案4

awk -F ' X+$' 'NF == 1' file

在任何空格上分割线,然后一直X到结束。如果只有一条记录,则最后一个字段仅由 组成X


perl -alne 'print if $F[-1] =~ y/X/-/ != length $F[-1]' test

如果最后一个字段的音译数等于该字段的长度,则最后一个记录整体由 生成X

相关内容