grep:在特定列中按编号保留行
Posted
技术标签:
【中文标题】grep:在特定列中按编号保留行【英文标题】:grep: keep lines by number in specific column 【发布时间】:2016-04-23 14:55:05 【问题描述】:我知道如何用 awk 来做,例如,keep lines,它在第二列中包含数字 3:$ awk '"$2" == 3'
但是如何只用 grep 做同样的事情呢? 第一列呢?
【问题讨论】:
grep "^pattern" file
也许?
tnx,这适用于 1. 列,那么 2. 列呢?
最后一栏是第三栏还是第二栏?
如果你有很多列,你应该使用awk
。
@EdMorton tab 和 bash 需要与 gnu grep(没有 -P
)不知道 \t
相同的奇怪特技。
【参考方案1】:
Grep
不适合这个,awk
更好。但是假设你的列是用空格分隔的,那么你想要
grep -E '^[^ ]+ +3( |$)'
解释:查找具有行首的内容,后跟一个或多个非空格字符(第一列),然后是一个或多个空格字符(列分隔符),然后是数字 3,然后是空格(因为还有另一列)或行尾(如果没有其他列)。
(在测试后更新以修复语法。)
【讨论】:
idk,如果我只是复制粘贴您的代码,它对我不起作用,也许我太愚蠢了:P 但这对我有用:grep -P '^[^\s ]*\s3\s' 在测试后修改语法。 请注意,\S
应该等同于 perl-regex 模式下的[^\s]
。您可能还需要+
而不是*
,具体取决于列是否可以为空。前者为“1个或多个”,后者为“0个或多个”。
@MartaKoprivnik 如果某个答案对您有用并且您对结果感到满意,请接受该答案。您甚至可能还想点击投票按钮来支持作者:-)【参考方案2】:
下面是来自 cmets 对我的神秘命令 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)34
。 (注意括号和3
)。
您可以看到许多细节,而且 awk 更加优雅和简单。
您可以在documentation of grep 中阅读此内容,然后您需要学习一些有关正则表达式的知识,例如start here.
【讨论】:
以上是关于grep:在特定列中按编号保留行的主要内容,如果未能解决你的问题,请参考以下文章
在python数据框中删除不包含列中特定字符串的多列的重复项