假设输入是(.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/