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)
感谢您的帮助!
使用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)
使用标准删除仅在末尾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)