используя sort и uniq -c в awk из второй строки данных

Подобных вопросов много, но все они (которые я видел) интересуются сортировкой и подсчетом повторяющихся строк из первой строки данных. В моем случае мне нужно оставить первую строку нетронутой и сверху, при этом вызывая sort | uniq -c для всех следующих строк. Я добрался до части сортировки, единственная часть, с которой я застрял, это uniq -c. Я пробовал каналы, вызывая system("uniq -c"), другие комбинации system(...), но ничего не работает. Моя текущая строка команд выглядит так, но она доходит только до части сортировки:

myProgram input_file other_input_file | awk 'NR<2{print $0;next}{print $0 | "sort"}'

и отсюда получаю:

Id: revision_data  #this needs to stay on top
0
0
10.1007/S00253-012-4050-Z
10.1007/S00775-006-0142-5
10.1021/ACS.BIOCHEM.5B00958
10.1021/BI020286F
10.1038/35422
10.1093/NAR/28.8.1743
10.1093/NAR/GKN245
10.7554/ELIFE.00813

а мне нужно вот это:

Id: revision_data
   2 0
   1 10.1007/S00253-012-4050-Z
   1 10.1007/S00775-006-0142-5
   1 10.1021/ACS.BIOCHEM.5B00958
   1 10.1021/BI020286F
   1 10.1093/NAR/28.8.1743
   1 10.1093/NAR/GKN245
   1 10.7554/ELIFE.00813

как я могу вставить uniq -c в свои команды, чтобы получить нужный мне результат?


person Kamilė Vainiūtė    schedule 12.12.2019    source источник
comment
Почему 10.1038/35422 не выводится?   -  person anubhava    schedule 12.12.2019
comment
наверное не специально пропустил. простите!   -  person Kamilė Vainiūtė    schedule 12.12.2019


Ответы (3)


Так что просто сохраните первую строку, выведите ее, а затем продолжите свой скрипт.

{
   IFS= read -r firstline
   printf "%s\n" "$firstline"
   sort | uniq -c
} < input_file
person KamilCuk    schedule 12.12.2019
comment
как вы предлагаете поместить его в трубу с одним вкладышем? поскольку myProgram выводит по одной строке за раз и только после того, как это будет сделано, мне нужна сортировка. с awk или любой другой командой? - person Kamilė Vainiūtė; 12.12.2019
comment
Спасибо! я пробовал это, прежде чем комментировать ваш ответ, но, кажется, я не оставлял пробелов до и после { - person Kamilė Vainiūtė; 12.12.2019

Вы можете использовать это gnu awk:

awk 'NR == 1 { print; next } { ++freq[$0] } END {
     PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in freq) print freq[i], i }' file

Id: revision_data
2 0
1 10.1007/S00253-012-4050-Z
1 10.1007/S00775-006-0142-5
1 10.1021/ACS.BIOCHEM.5B00958
1 10.1021/BI020286F
1 10.1038/35422
1 10.1093/NAR/28.8.1743
1 10.1093/NAR/GKN245
1 10.7554/ELIFE.00813
person anubhava    schedule 12.12.2019

Вы можете объединить первую строку файла с вашей командой, примененной к другим строкам.

Например:

кошка ‹(head -n1 имя файла) ‹(sort ‹(tail -n+2 имя файла) | uniq -c)

Это применяет sort | uniq -c ко всем строкам, начинающимся со второй (через tail -n+2). Это связано с первой строкой (через head -n1) с помощью cat.

person borrible    schedule 12.12.2019