Как объединить строки нескольких связанных файлов в одну строку и добавить ее в выходной файл

Лично я предпочел бы, чтобы секция awkбыла как можно более простой и обходилась без нее. Смешанная логика не использует преимущества конвейеров Unix, и поэтому ее сложнее понять, отладить или модифицировать для тесно связанных вариантов использования.

cat filename.txt | perl -pe 's{.*|}{}g' | awk '{sum+=$1} END {print sum}'
2
21.09.2021, 13:46
1 ответ

Предполагая, что ваш ввод не содержит второстепенных случаев, следующий цикл оболочки в связи с 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, которая будет печатать -все в одной строке

  • все поля, кроме последнего, первой строки каждого входного файла (, но с предшествующим дополнительным OFS в случае второго входного файла, характеризуемого FNR, счетчиком строк файла -, больше не равный NR, глобальный счетчик строк ),
  • последнее поле каждой строки до строки 3,
  • когда не остается входного файла, разделитель закрывающей записи (по умолчанию становится новой строкой)

и добавляет результат к template.tsv. Это также будет работать, если второй файл шаблона не существует,потому что токен пустой строки не будет распознан как входной файл с помощью awk, в первую очередь, поэтому раздел END, печатающий новую строку, будет достигнут уже после первого файла.

2
22.09.2021, 09:03

Теги

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