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

Delete line after nth occurrence of a value in a TSV

我有一个 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 脚本中,我想 trim 下文件,以便它只包含每个区域的前两个最流行的搜索

例如,输出应该是这样的:

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

我认为解决方案涉及一些 awk,但我不太明白。

答案出奇的小:

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

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

将限制作为参数发送:

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

另一个 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

$