В оболочках 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
не будет содержать символы новой строки.
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, ",")