grep:在特定列中按行数保留行

时间:2016-04-23 14:55:06

标签: bash awk grep

我知道如何使用awk,例如,保留行,其中包含第二列中的数字3:$ awk'“$ 2”== 3'

但是如何只用grep做同样的事情呢? 第一栏怎么样?

2 个答案:

答案 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