在 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
$
我有一个 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
$