Всегда ли после изменения определенного поля в awk
информация о разделителе полей вывода теряется? Что произойдет, если есть несколько разделителей полей, и я хочу, чтобы они были восстановлены?Выходные разделители полей в awk после подстановки в полях
Например, предположим, что у меня есть простой файл example
, который содержит:
a:e:i:o:u
Если я просто запустить awk
скрипт, который принимает во внимание разделителем поля ввода, который печатает каждую строку в мой файл, например as running
awk -F: '{print $0}' example
Я увижу оригинальную линию. Если, однако, я изменяю одно из полей напрямую, например. с
awk -F: '{$2=$2"!"; print $0}' example
Я не вернусь модифицированной версией оригинальной линии, а я вижу поле, разделенное сепаратор пробелов по умолчанию, то есть:
a e! i o u
я могу получить обратно модифицированную версию оригинала, задающий OFS, например:
awk -F: 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example
в случае, однако, где существует несколько потенциальных разделители поля, но в случае нескольких сепараторов есть простой способ восстановления исходных сепараторов?
Например, если example
было как :
и ;
как разделители, я не мог использовать -F":|;"
обработать файл, но OFS бы не быть достаточно, чтобы восстановить исходные сепараторы в их взаимном расположении.
Более точно, если мы перешли на example2
, содержащего
a:e;i:o;u
мы могли бы использовать
awk -F":|;" 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example2
(или -F"[:;]"
), чтобы получить
a:e!:i:o:u
, но мы потеряли различие между и ; который был бы сохранить, если мы могли бы восстановить
a:e!;i:o;u
Вопрос один из редких хороших здесь. Почему бы просто не добавить нерабочий пример, используя '-F '[:;]''. Это сделало бы вопрос идеальным - imo – hek2mgl
Явный пример добавлен – borrible
Обозначение разделителя полей RT будет очевидным расширением GNU. Интересно, почему у них этого нет. –