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



我知道如何使用awk来做到这一点,例如,保留行,第二列中包含数字3:$ awk '"$2" == 3'

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

Grep对此

不是很好,awk更好。但是假设您的列由空格分隔,那么您需要

grep -E '^[^ ]+ +3( |$)'

说明:查找具有行首的内容,后跟一个或多个非空格字符(第一列),然后是一个或多个空格字符(列分隔符),然后是数字 3,然后是空格(因为有另一列)或行尾(如果没有其他列)。

(测试后更新以修复语法。

以下是我对评论中神秘命令grep -P '^[^t]*t3t' your_file的较长解释:

我假设列分隔符是一个制表符。 没有-P的 grep 需要一些奇怪的东西才能直接使用它(参见例如 见这里 )。该-P可以毫无问题地编写t。例如,如果您的分隔符;那么您可以将t替换为;,并且不需要-P选项。

话虽如此,让我们解释一下正则表达式背后的想法:您说,您想匹配第二列中的3

  • ^表示:在行首
  • [^t]*的意思是:零次或多次(*)不是制表符的事物的出现([^t]这里的^的意思是"不是a")
  • 后跟制表符
  • 其次是3
  • 后跟制表符

现在我们已经有效地表达了我们需要一个3作为第二列的内容的想法(t3t),我们对第一列的精确内容不感兴趣。^[^t]*t只需要表达"接下来的内容在第二列中"的想法。

如果要匹配第四列中的

某些内容,则可以使用它来"跳过"前三列并匹配第四列中的4: ^([^t]*t){3}4。(注意括号和{3})。

正如你所看到的许多细节和awk更加优雅和容易。

你可以在 grep 的文档中阅读这一点,然后你需要学习一些关于正则表达式的东西,例如从这里开始。

最新更新