在TSV中第n次出现值后删除行

时间:2019-03-07 20:03:35

标签: bash csv awk gnu-coreutils

我有一个TSV文件,其中包含来自世界不同地区的搜索词组。这些短语按区域分组,并按降序排列。

第三列是进行网络搜索的区域(例如US_VA ==美国弗吉尼亚州)

第二列代表实际的搜索词组。

第一列代表在该区域中搜索短语的次数。

10  shoes   US_MA
9   boot    US_MA
4   coat    US_MA
12  hat US_TX
20  bathing suit    US_CA
18  shorts  US_CA
15  t shirt US_CA
10  sandals US_CA

在bash脚本中,我想缩小文件,使其仅包含每个区域的前两个最受欢迎的搜索

例如,输出应类似于:

10  shoes   US_MA
9   boot    US_MA
12  hat US_TX
20  bathing suit    US_CA
18  shorts  US_CA

我认为该解决方案涉及awk,但我不太清楚。

2 个答案:

答案 0 :(得分:4)

答案非常小:

awk '++count[$NF] < 3' file.tsv

这取决于所描述的文件的排序。

要发送限制作为参数:

n=2
awk -v limit=$n '++count[$NF] <= limit' file.tsv

答案 1 :(得分:0)

另一个awk

awk ' {c=$NF; if(p!=c) { print ;t=1 } else { if(t<2) print ;t++ } p=c } ' file

具有给定的输入

$ cat alec.txt
10  shoes   US_MA
9   boot    US_MA
4   coat    US_MA
12  hat US_TX
20  bathing suit    US_CA
18  shorts  US_CA
15  t shirt US_CA
10  sandals US_CA

$ awk ' {c=$NF; if(p!=c) { print ;t=1 } else { if(t<2) print ;t++ } p=c } ' alec.txt
10  shoes   US_MA
9   boot    US_MA
12  hat US_TX
20  bathing suit    US_CA
18  shorts  US_CA

$