3

У меня ниже сценарий:

Итерация 1 -

Ddd
Bbb
Ccc
Ddd
Eee
Fff
Ddd

Итерация 2 -

Ddd
Bbb
Ddd

Я хочу объединить данные, как показано ниже -

Вывод итерации 1 -

Ddd Bbb Ccc
Ddd Eee Fff
Ddd

Вывод итерации 2 -

Ddd bbb
Ddd

Я хочу использовать awk NR для создания динамических блоков для объединения данных, т.е. NR% 3 в выводе итерации 1 и NR% 2 в выводе итерации 2.

Я пытался использовать переменную для динамического присвоения значений, т.е. NR% $ cnt, но это привело к ошибке.

Любезно помочь.

3 ответа3

2

Мой метод не требует предположения о том, как часто встречается Ddd ; это может происходить нерегулярно. Метод должен работать, если в вашем вводе нет нулевого символа или если ввод не заканчивается новой строкой (см. Это), или ваши инструменты ограничены (например, sed -z не указан в POSIX).

sed '1! s/^Ddd$/\x00Ddd/' | tr '\n' ' ' | sed -z 's/ $/\n/' | tr -d '\0'

Процедура:

  1. sed обнаруживает строки, которые являются Ddd и предшествует каждой из них нулевым символом, если только строка не является первой. Эти нулевые символы теперь разделяют наши будущие строки.
  2. tr заменяет каждый символ новой строки пробелом. Это строит нашу будущую строку: прежние строки теперь разделены пробелами.
  3. Каждая последующая строка, кроме последней, содержит дополнительный пробел в конце от новой строки, первоначально перед Ddd ; последняя строка будет содержать дополнительный пробел от последней новой строки, требуемой POSIX. sed -z читает строки с нулевым символом в конце (строки, которые будут) и заменяет эти символы в конце пробела обычными символами новой строки. В этот момент будущие линии становятся регулярными линиями.
  4. tr -d удаляет нулевые символы.
1

Вы можете использовать это (это из GNU coreutils):

pr --columns=3 --across --separator=' ' --omit-pagination    # pr -3 -a -s' ' -T

Он будет читать из стандартного ввода или из файла. Если дать вам первый столбец данных, вы получите следующий вывод:

Ddd Bbb Ccc
Ddd Eee Fff
Ddd

Замените --columns=3 на --columns=2 для второго файла:

Ddd bbb
Ddd
1

Вот вариант (это из GNU findutils):

xargs --no-run-if-empty --max-args=3    # xargs -r -n3

Он будет читать из стандартного ввода или из файла. Если дать вам первый столбец данных, вы получите следующий вывод:

Ddd Bbb Ccc
Ddd Eee Fff
Ddd

Измените --max-args=3 на --max-args=2 для второго файла:

Ddd bbb
Ddd

Вот еще один вариант, на этот раз основанный на awk . Измените NR % 3 на NR % 2 для второго файла.

awk '{ printf "%s", $0 } { if (NR % 3) { printf " " } else { printf "\n" } }'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .