unix - 查找与模式匹配的行,前提是它们在指定列中的值在输入文件中恰好出现两次

标签 unix awk grep

假设输入是(.csv 文件):

a,b_b,3,c
d,k_k,3,f
g,h_h,3,i
j,k_k,4,l
m,n_n,4,o
p,k_k,5,q
r,s_s,5,t

我想要这个输出:

包含模式“k_k”的所有行,其第三列中的数字正好在两行中找到(例如:数字 4 和 5):

j,k_k,4,l
p,k_k,5,q

这可能很简单,但我找不到实现这一目标的方法。谁能帮助我使用 Unix 命令行 (awk)?

awk '/k_k/' && ?? file.csv

最佳答案

我想你想要这样的东西:

awk -F, 'FNR==NR{a[$3]++;next} /k_k/ {if(a[$3]==2)print $0}' file file

我假设您的意思是第 3 列中的数字在文件中恰好出现两次,而不是数字 4 或 5。此解决方案对您的文件进行 2 次遍历,以计算每个数字在列中出现的次数3 第一次和第二次打印匹配的行。因此输入文件在命令行上指定了两次。

作为解释说明,它计算 a[1] 中第 3 列中 1 出现的次数,并计算 a[2] 中第 3 列中 2 出现的次数,等等...

阅读你的问题标题,它说“最多 2 行”,所以如果出现在一行中也可以,你应该将我的代码中的“==”更改为“<=”。我不明白你的意思。

关于unix - 查找与模式匹配的行,前提是它们在指定列中的值在输入文件中恰好出现两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21319441/

相关文章:

Java 进程终止 - onEnd()?

linux - 根据匹配模式将一行行 grep 到 shell 变量中

variables - 在 awk 中使用变量初始化正则表达式

c++ - 如何对大型文本文件运行字典搜索?

unix - 当删除一个窗口时,如何使 tmux 重新排序?

c - 错误的文件描述符

在信号处理程序中调用标准库函数

bash - 使用自定义记录分隔符和字段分隔符格式化文本输出的 awk 命令

regex - 带有复杂分隔符的 Linux grep 命令

regex - 删除匹配和上一行