Лично я предпочел бы, чтобы секция awk
была как можно более простой и обходилась без нее. Смешанная логика не использует преимущества конвейеров Unix, и поэтому ее сложнее понять, отладить или модифицировать для тесно связанных вариантов использования.
cat filename.txt | perl -pe 's{.*|}{}g' | awk '{sum+=$1} END {print sum}'
Предполагая, что ваш ввод не содержит второстепенных случаев, следующий цикл оболочки в связи с awk
программой должен выполнять:
for f in BC*-tmp1.tsv
do
f2="${f/%tmp1.tsv/tmp2.tsv}"
if [[ ! -f $f2 ]]; then f2=""; fi
awk 'BEGIN{FS=OFS="\t"}
FNR==1{for (i=1;i<NF;i++) printf "%s%s",(NR==FNR&&i==1?"":OFS),$i}
FNR<=3{printf "%s%s",OFS,$NF}
END{printf "%s",ORS}' "$f" "$f2" >> template.tsv
done
Будет выполнен цикл по всем файлам tmp1.tsv
и сгенерировано соответствующее имя файла для файла tmp2.tsv
. Если окажется, что второй файл не существует, имя файла будет установлено на пустую строку.
Затем будет вызвана программа awk
с обоими ассоциированными файлами TSV, которая будет печатать -все в одной строке
FNR
, счетчиком строк файла -, больше не равный NR
, глобальный счетчик строк ), и добавляет результат к template.tsv
. Это также будет работать, если второй файл шаблона не существует,потому что токен пустой строки не будет распознан как входной файл с помощью awk
, в первую очередь, поэтому раздел END
, печатающий новую строку, будет достигнут уже после первого файла.