在Unix/bash中删除符合列条件的行

2 投票
1 回答
2361 浏览
提问于 2025-04-17 17:47

在bash中,如何用一句简单的命令快速过滤掉一个以制表符分隔的文件中,如果第N列包含字符串s的所有行?举个例子:

$ cat myfile 
A  B_crop  C
A  X_mock  D

$ cat myfile | filter -V -c 2 -s "crop"
A  X_mock  D

这个假想的命令filter接受一个列号(从1开始的)-c和一个字符串-s,只保留在指定列中包含这个字符串的行。如果加上-V参数,就像grep一样,排除那些在该列中没有这个字符串的行。谢谢。

1 个回答

3

因为你想根据某一列来排除一些内容,所以我建议使用 awk

awk '$2 == "crop" { print $0 }' myfile

这里的 $2 是指用第二列进行比较。要实现 -V 的功能,可以用 != 来代替 ==

你还可以使用正则表达式来检查子字符串:

awk '$2 ~ /crop/ { print $0 }' myfile

正则匹配也可以用 !~ 来表示否定。

撰写回答