我知道如何使用awk,例如,保留行,其中包含第二列中的数字3:$ awk'“$ 2”== 3'
但是如何只用grep做同样的事情呢? 第一栏怎么样?
答案 0 :(得分:3)
Grep
对此不太好,awk
更好。但假设您的列以空格分隔,那么您需要
grep -E '^[^ ]+ +3( |$)'
说明:查找具有行首的内容,后跟一个或多个非空格字符(第一列),然后是一个或多个空格字符(列分隔符),然后是数字3,然后是空格(因为还有另一列)或行尾(如果没有其他列)。
(更新以在测试后修复语法。)
答案 1 :(得分:2)
以下是对我的神秘命令grep -P '^[^\t]*\t3\t' your_file
的更长解释:
我假设列分隔符是一个选项卡。没有-P
的grep需要一些奇怪的东西才能直接使用它(参见例如see here)。 -P
可以毫无问题地编写\t
。例如,如果您的分隔符为;
,那么您可以将\t
替换为;
,而您不需要-P
选项。
话虽如此,让我们解释正则表达式背后的想法:你说,你想匹配第二列中的3
:
^
表示:在行的开头[^\t]*
表示:零个或多个(*
)出现的内容不是标签([^\t]
此处^
表示"不是") 3
现在我们已经有效地表达了我们需要3
作为第二列(\t3\t
)内容的想法,我们对第一列的精确内容不感兴趣。 ^[^\t]*\t
仅用于表达这个想法"以下内容在第二列"。
如果你想匹配第四列中的某些内容,你可以使用它来"跳过"前三列并匹配第四列中的4:
^([^\t]*\t){3}4
。 (注意括号和{3}
)。
正如你可以看到许多细节和awk更优雅和容易。
您可以在documentation of grep中阅读此内容,然后您需要学习一些有关正则表达式的内容,例如start here