我有一个文件(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
这匹配一个空格,后跟某个字符,然后是零个或多个该特定字符到行尾。匹配的行被删除。
只是使用相同的想法,以下内容将删除末尾仅包含重复序列(例如ABCABC
or )的行: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
。