Как убрать повторение контента?

У меня есть файл psychrobacter_aquaticus.txt, содержащий следующее содержимое:

WP_021815421.1  OG5_132922  deth|YP_182312  3   -07 42.35   81.7
WP_021815427.1  OG5_128110  rbal|NP_868155  1   -55 50.72   53.2
WP_012456834.1  NO_GROUP    bsui|NP_700181  8   -53 48.18   62
WP_084606289.1  OG5_132922  aful|NP_069703  5   -28 57.00   92.6
WP_084606284.1  OG5_153487  bpse|YP_331974.1    6   -78 48.87   91.4

, а другой файл psychrobacter_arcticus.txt содержит следующую информацию:

WP_007394757.1  OG5_129150  cbur|NP_820894  7   -12 84.09   100
WP_010195908.1  OG5_130915  yent|YP_001007837.1 6   -16 70.42   100
WP_011281115.1  OG5_128110  rbal|NP_868155  1   -56 51.67   52.3
WP_010196670.1  OG5_126760  yent|YP_001008069.1 7   -46 85.44   100
WP_010196689.1  OG5_128312  sent|NP_458465  8   -36 68.81   100
WP_010196702.1  OG5_126678  sfle|NP_709098  7   -52 81.30   100
WP_011281110.1  OG5_132922  deth|YP_182312  1   -07 38.82   81.7
WP_011281234.1  NO_GROUP    bsui|NP_700181  8   -53 48.18   62
WP_011281111.1  OG5_132922  aful|NP_069703  5   -28 55.88   94.4
WP_010196711.1  OG5_126722  sent|NP_458477  2   -53 73.29   96.4
WP_010196728.1  OG5_126681  bpse|YP_335116.1    1   -42 80.36   86.8

Я хочу извлечь только соответствующие шаблон (на основе OG number), поэтому я пишу следующий скрипт:

cut -d 

он дает мне следующий вывод:

OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_aquaticus WP_084606289.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_128110  psychrobacter_aquaticus WP_021815427.1
OG5_128110  psychrobacter_arcticus  WP_011281115.1
OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_aquaticus WP_084606289.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_153487  psychrobacter_aquaticus WP_084606284.1

Но я хочу следующий вывод:

OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_128110  psychrobacter_aquaticus WP_021815427.1
OG5_128110  psychrobacter_arcticus  WP_011281115.1
OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_153487  psychrobacter_aquaticus WP_084606284.1

Я имею в виду, что если он обнаружил номер OG дважды или более раз, то должен быть напечатан только первый соответствующий. Кто-нибудь может направить меня?

\t' -f 2 psychrobacter_aquaticus > set1 cat set1 | while read line; do grep $line *.txt >> set3 done grep -v "NO_GROUP" set3 | tr ':' '\t' | cut -d

он дает мне следующий вывод:

OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_aquaticus WP_084606289.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_128110  psychrobacter_aquaticus WP_021815427.1
OG5_128110  psychrobacter_arcticus  WP_011281115.1
OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_aquaticus WP_084606289.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_153487  psychrobacter_aquaticus WP_084606284.1

Но я хочу следующий вывод:

OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_128110  psychrobacter_aquaticus WP_021815427.1
OG5_128110  psychrobacter_arcticus  WP_011281115.1
OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_153487  psychrobacter_aquaticus WP_084606284.1

Я имею в виду, что если он обнаружил номер OG дважды или более раз, то должен быть напечатан только первый соответствующий. Кто-нибудь может направить меня?

\t' -f 1,2,3 | awk '{print $3 "\t" $1 "\t" $2}' | sed 's/.txt//' > MCL_result rm set1 set3

он дает мне следующий вывод:

OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_aquaticus WP_084606289.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_128110  psychrobacter_aquaticus WP_021815427.1
OG5_128110  psychrobacter_arcticus  WP_011281115.1
OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_aquaticus WP_084606289.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_153487  psychrobacter_aquaticus WP_084606284.1

Но я хочу следующий вывод:

OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_132922  psychrobacter_arcticus  WP_011281111.1
OG5_128110  psychrobacter_aquaticus WP_021815427.1
OG5_128110  psychrobacter_arcticus  WP_011281115.1
OG5_132922  psychrobacter_aquaticus WP_021815421.1
OG5_132922  psychrobacter_arcticus  WP_011281110.1
OG5_153487  psychrobacter_aquaticus WP_084606284.1

Я имею в виду, что если он обнаружил номер OG дважды или более раз, то должен быть напечатан только первый соответствующий. Кто-нибудь может направить меня?

1
задан 13 May 2019 в 08:36

1 ответ

Проблема:

  • Напечатайте второе поле, имя файла без расширения, затем первое поле.
  • Разделите выходные поля с помощью табуляции.
  • Пропустить строки, содержащие NO_GROUP.
  • В выходном файле комбинация первого и второго полей должна быть уникальной (они составляют уникальный ключ): любые дальнейшие записи, имеющие такой же ключ, должны быть отброшены.

Решение:

awk 'FNR == 1 {delete a} !/NO_GROUP/ && !($2 in a) {print $2"\t"gensub(/\..*$/, "", 1, FILENAME)"\t"$1; a[$2]++;}' *.txt

Результаты тестового прогона:

OG5_132922      psychrobacter_aquaticus WP_021815421.1
OG5_128110      psychrobacter_aquaticus WP_021815427.1
OG5_153487      psychrobacter_aquaticus WP_084606284.1
OG5_129150      psychrobacter_arcticus  WP_007394757.1
OG5_130915      psychrobacter_arcticus  WP_010195908.1
OG5_128110      psychrobacter_arcticus  WP_011281115.1
OG5_126760      psychrobacter_arcticus  WP_010196670.1
OG5_128312      psychrobacter_arcticus  WP_010196689.1
OG5_126678      psychrobacter_arcticus  WP_010196702.1
OG5_132922      psychrobacter_arcticus  WP_011281110.1
OG5_126722      psychrobacter_arcticus  WP_010196711.1
OG5_126681      psychrobacter_arcticus  WP_010196728.1

Сортировка:

Если вы хотите отсортировать результаты, просто перенаправьте их на sort или sort -k2,2 в зависимости от желаемого результата.

0
ответ дан 13 May 2019 в 08:36

Другие вопросы по тегам:

Похожие вопросы: