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

Jia*_*iao 2 shell bash sed 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
...
Run Code Online (Sandbox Code Playgroud)

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

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

tha*_*isp 7

使用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
Run Code Online (Sandbox Code Playgroud)

或者与grep

grep -v '[[:space:]]XX*$' file
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 6

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

sed '/ X\{1,\}$/d' file
Run Code Online (Sandbox Code Playgroud)

或者,

sed '/ XX*$/d' file
Run Code Online (Sandbox Code Playgroud)

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

sed -E '/ X+$/d' file
Run Code Online (Sandbox Code Playgroud)

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

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

grep -v ' X\{1,\}$' file
Run Code Online (Sandbox Code Playgroud)

相当于

sed '/ X\{1,\}$/d' file
Run Code Online (Sandbox Code Playgroud)

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

sed '/ \(.\)\1*$/d' file
Run Code Online (Sandbox Code Playgroud)

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

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

sed '/ \(..*\)\1\1*$/d' file
Run Code Online (Sandbox Code Playgroud)