if ($ 1 $ 2 в массиве)
не работает;
вы должны выполнить if (($ 1, $ 2) в массиве)
. массив [$ 3]
и массив [$ 4]
таким образом.
Ваш массив выглядит как array [chrY, 59363551] = «chrY 59363551 G 8 0 7 0 0 0 1 0 5 0 0 0 0 0 0 0 7 0 0 0» array [chrY, 59363552] = «chrY 59363552 G 7 0 7 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0» ︙и когда вы говорите
array [$ 3 ]
и массив [$ 4]
,
вы имеете в виду массив [G]
и массив [2]
и т. Д. ,
которых не существует. > " filename "
в awk
коде
- отличная возможность, когда вы хотите записать в несколько файлов.
Это не так полезно, когда у вас есть только один выходной файл -
почему бы вам просто не перенаправить вывод команды awk
? array
.
Это как переменная с именем переменная
,
файл с именем файл
, человек по имени Человек
и т. Д. {{ 1}} Используйте описательные имена. Хорошо, но при этом
awk 'FNR==NR {file1data[$1,$2]=$0; next}
{ if (($1,$2) in file1data) {
# Save desired values from file2.
file2arg03=$3
file2arg04=$4
file2arg08=$8
file2arg10=$10
file2arg12=$12
pct_file2=($8+$10+$12)/$4
# Get data from file1.
$0=file1data[$1,$2]
pct_file1=($8+$10+$12)/$4
print $1, $2, $3, $4, $8, $10, $12, pct_file1, \
file2arg03, file2arg04, file2arg08, file2arg10, file2arg12, \
pct_file2, pct_file1-pct_file2
} else printf "(%s,%s) in file2 but not file1.%s", $1, $2, ORS
}' treated.bam.tsv untreated.bam.tsv > awkoutput.bam.tsv
Как и ваша версия, эта команда сохраняет данные file1 в массиве
, а затем выполняет всю работу / вывод, пока читает file2.
Получив строку из файла2,
он сохраняет нужные поля из этой строки в именованные переменные
(мы также можем использовать другой массив, состоящий из пяти элементов)
, а затем он восстанавливает данные из соответствующей строки в file1.
Если присвоить всю строку $ 0
,
это вызовет $ 1
, $ 2
, $ 3
, $ 4
и т. Д.,
для восстановления их исходных значений.
У вас действительно проблемы с написанием строки заголовка в выводе? Попробуйте:
{ if (FNR == 1) {
print "chrom pos ref reads_all mismatches deletions insertions pct_file1 …"
} else if (($1,$2) in file1data ) {
file2arg03=$3
︙
Хорошо, вот версия, которая по духу ближе к вашей попытке, и обрабатывает строку заголовка:
awk 'FNR==NR {file1line[$1,$2]=$0; next}
{ if (FNR == 1) {
print "chrom pos ref reads_all mismatches deletions insertions pct_file1 ref reads_all mismatches deletions insertions pct_file2 pct_sub …"
} else if (($1,$2) in file1line ) {
# Get data from file1.
split(file1line[$1,$2], file1arg)
pct_file1=(file1arg[8]+file1arg[10]+file1arg[12])/file1arg[4]
pct_file2=($8+$10+$12)/$4
print $1, $2, file1arg[3], file1arg[4], file1arg[8], \
file1arg[10], file1arg[12], pct_file1, \
$3, $4, $8, $10, $12, pct_file2, pct_file1-pct_file2
} else printf "(%s,%s) in file2 but not file1.%s", $1, $2, ORS
}' treated.bam.tsv untreated.bam.tsv > awkoutput.bam.tsv
Это извлекает строку из файла1 (из file1line
)
и передает его в split
, чтобы разбить его на составляющие 23 значения,
которые сохраняются в массиве file1arg
.
Затем он сможет использовать file1arg [3]
, file1arg [4]
,…,
так, как вы использовали array [ $ 3]
, массив [$ 4]
,…
Это метод, который я нашел, столкнувшись с той же проблемой:
for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done
Я писал файл скрипта bash для автоматического обновления сертификатов ssl.
Используйтеrename
:
rename 's/\s/_/g'./*.xml
Нет необходимостиfind
:)