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个或多个”。 @MartaKop​​rivnik 如果某个答案对您有用并且您对结果感到满意,请接受该答案。您甚至可能还想点击投票按钮来支持作者:-)【参考方案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数据框中删除不包含列中特定字符串的多列的重复项

更新列中的特定行

仅消除某些列中的重复行,将所有列保留在 R [重复]

如何更新账单编号栏?或在 sql server 的列中按顺序排列

如何在github中自动保留特定数量的最新标签?

如何在EXCEL里面将相同编号的数值相加,不同编号的数值保留。求具体算法。