Если какое-либо слово появляется хотя бы 4 раза в списке, я хочу напечатать его. Как мне сделать это с помощью awk? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть список видов с их оценками (1 вид на линию, 1 балл на линию), некоторые из этих видов появляются более одного раза (то есть у них более одного балла). Я хочу знать, какие виды имеют по крайней мере 4 балла.

В UNIX bash.

grep SCORE_INFO reformatted_output | grep -v '\-999' | uniq -c | awk '$4>=4{print}' 

(grep-ed SCORE_INFO, поскольку есть другие строки с другой информацией)

Некоторые результаты, которые выводятся на печать, печатаются только 2 или 3 раза, так что это не работает?

пример ввода:

================================================
INPUT_LINE_NUMBER 0
FULL_LINE 0  Candidatus Blochmannia floridanus
GENUS 0 Blochmannia
BINOMIAL_SPECIES 0 Blochmannia floridanus
EXTRA_INFO 0 
SCORE_INFO 0 Blochmannia floridanus -999
================================================
================================================
INPUT_LINE_NUMBER 1
FULL_LINE 1  Buchnera aphidicola str. Bp (Baizongia pistaciae)
GENUS 1 Buchnera
BINOMIAL_SPECIES 1 Buchnera aphidicola
EXTRA_INFO 1 str.Bp(Baizongiapistaciae)
SCORE_INFO 1 Buchnera aphidicola -999
================================================
================================================
INPUT_LINE_NUMBER 2
FULL_LINE 2  Buchnera aphidicola str. 5A (Acyrthosiphon pisum) SCORE 15.22082
GENUS 2 Buchnera
BINOMIAL_SPECIES 2 Buchnera aphidicola
EXTRA_INFO 2 str.5A(Acyrthosiphonpisum)
SCORE_INFO 2 Buchnera aphidicola 15.220829

пример вывода (который я сейчас получаю):

1 SCORE_INFO 124 Wigglesworthia glossinidia 55.224537
1 SCORE_INFO 125 Xenorhabdus bovienii 25.088634
1 SCORE_INFO 128 Yersinia enterocolitica 44.985457
1 SCORE_INFO 129 Yersinia pestis 12.072053
1 SCORE_INFO 131 Yersinia pestis 84.918046
1 SCORE_INFO 133 Yersinia pestis 79.520988
1 SCORE_INFO 139 Yersinia pestis 49.734360
1 SCORE_INFO 142 Yersinia pseudotuberculosis 34.544385
1 SCORE_INFO 143 Yersinia pseudotuberculosis 77.746483

1 Ответ

0 голосов
/ 23 октября 2019

Ваш вопрос не совсем ясен, однако я попытаюсь ответить на ваш базовый вопрос:

Я хочу знать, какие виды имеют по крайней мере 4 балла

Из вашего примера кода мы знаем, что:

  1. Нас интересуют строки, соответствующие SCORE_INFO
  2. Нам все равно, если счет равен -999
  3. Вид - строка, расположенная между вторым полем и последним полем.

Таким образом, следующая строка awk даст вам список имен, которые появляются 4 или более раз:

awk '!/^SCORE_INFO/ { next }
      ($NF == -999) { next }
      { key=""; for(i=3;i<NF;++i) key=(key=="" ? $i : key" "$i) }
      (++a[key] == 4) { print key }' file

Это вернет что-то вроде:

Yersinia pestis
Buchnera aphidicola

Если эти два имени появляются 4 или более раз

...