Удалить строку после n-го появления значения в TSV - PullRequest
0 голосов
/ 07 марта 2019

У меня есть файл 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 ]

4 голосов
/ 07 марта 2019

Ответ на удивление крошечный:

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

Это зависит от сортировки файла, как описано.

Чтобы отправить лимит в качестве параметра:

n=2
awk -v limit=$n '++count[$NF] <= limit' file.tsv
0 голосов
/ 08 марта 2019

Другой 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

$
...