bash: объединить (перемежить) два файла, вставив первую строку второго числа, до первого появления строки в первом ... - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь объединить два файла, которые выглядят как File1 и File2, во что-то, похожее на Result.Цель состоит в том, чтобы использовать шаблон в файле File1 и вставить первую строку файла 2 в строку перед шаблоном в файле 1 и рекурсивно работать с обоими файлами.

Файл1

Input:
Processed:
Result:
Input:
Result:
Input:
Error:
Result:
...

Файл2

Process1
Process2
Process3
…

Результат

Process1
Input:
Processed:
Result:
Process2
Input:
Result:
Process3
Input:
Error:
Result:
...

Пока что будет вставлена ​​строка из файла2 на строку ниже появление шаблона не выше:

awk 'NR==FNR{a[NR]=$0;next}1;/Input:/{print a[++i]}' File2 File2

Любая помощь приветствуется, спасибо!

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

вы почти у цели

$ awk 'NR==FNR{p[NR]=$0; next} /^Input:/{print p[++c]}1' file2 file1

Process1
Input:
Processed:
Result:
Process2
Input:
Result:
Process3
Input:
Error:
Result:

вы хотите напечатать строку после вставки, поэтому удалите строку печати до конца, что является 1 как сокращение.

0 голосов
/ 08 декабря 2018

Это может работать для вас (GNU sed):

sed -n '/Input:/=' file1 |
paste - file2 |
sed -nr 's/(.+)\t(.)/\1i\\\2/p' |
sed -f - file1

Это решение создает сценарий sed из file1 и file2, который использует номера строк из file1, где начинается строка Input:, и объединяет их ссоответствующая строка в файле2 как команда вставки.

Если после Input: всегда есть Result:, тогда будет приемлемо следующее решение.

sed -e '/Input:/R file2' -e '//h;//d' -e 'x;/./p;z;x' file1

Еще один способ:

sed '/Input:/i\insert here' file1 | sed -e '/^insert here/R file2' -e '//d'
0 голосов
/ 07 декабря 2018

Как я понимаю, вы хотите вставить строку из File2 над каждой строкой, совпадающей с Input: из File1.

Ниже это будет сделано:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*|4.0.*) echo "ERROR: Bash 4.1 or newer required" >&2; exit 1;; esac

exec {file1_fd}<File1 # open File1 for input, storing the FD# it's opened on in file1_fd
exec {file2_fd}<File2 # likewile for File2 and file2_fd

while IFS= read -r f1line <&"$file1_fd"; do  # as long as we can read a line from file1...
  if [[ $f1line =~ Input: ]]; then           # if that line contains "Input:"
    IFS= read -r f2line <&"$file2_fd"        # ...then read a second line from file2
    printf '%s\n' "$f2line"                  # ...and write that second line to our output
  fi
  printf '%s\n' "$f1line"                    # before writing the content from file1.
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...