Как сравнить два столбца двух файлов и вывести количество совпадений с помощью awk

В оболочках POSIX $IFSявляется полем разделителем , а не разделителем, поэтому значение $PATH, например /bin:/usr/bin:, будет разделено на /binи /usr/binвместо /bin., /usr/binи пустая строка (, означающая текущий каталог ). Вам нужно:

IFS=:; set -o noglob
for var in $PATH""; do
  printf '<%s>\n' "$var"
done

Чтобы избежать изменения глобальных настроек, вы можете использовать оболочку с явными операторами разделения, напримерzsh:

for var in "${(s/:/@)PATH}"; do
  printf '<%s>\n' "$var"
done

Хотя в этом случае zshуже имеет массив $path, привязанный к $PATH, как в csh/ tcsh, поэтому:

for var in "$path[@]"; do
  printf '<%s>\n' "$var"
done

В любом случае, да, теоретически $PATHкак и любая переменная может содержать символы новой строки, символ новой строки никоим образом не является особенным, когда речь идет о разрешении пути к файлу. Я не ожидаю, что кто-нибудь здравомыслящий поместит каталог с новой строкой (или подстановочными знаками )в свой $PATHили назовет команду с новой строкой в ​​ее имени. Также трудно представить себе сценарий, в котором кто-то может использовать скрипт, который предполагает, что $PATHне будет содержать символы новой строки.

1
22.02.2021, 19:21
1 ответ
awk 'BEGIN{ OFS=FS="\t" }
  NR==FNR{ clade[$1]=$2; next }         # save clade, mutation of B.tsv in array
  FNR==1{ print $0, "number"; next }    # print header
  !($2 in clade){ print; next }         # no match -> print record
  {                                     # else...
     split($3 "," clade[$2], tmp, ",")  # split mutations into tmp array
     for (i in tmp)                     # for all mutations
       if (++num[tmp[i]] > 1)           # if same mutation occurs more than once
         ++count                        # increment counter

     print $0, count                    # print record and count
     delete num                         # reset temporary array
     count=0                            # reset counter
  }
' B.tsv A.tsv > C.tsv

Второй ответ:

Заменить строку 3 на:

FNR==1{ print $0, "number", "total_mut"; next }

Замените последний printна :

.
print $0, count, split(clade[$2], tmp, ",")
1
18.03.2021, 22:29

Теги

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