Сохранение исходного формата СООБЩЕНИЯ, проходящего через AWK

StackOverflow https://stackoverflow.com/questions/408469

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня проблема с использованием AWK для простого удаления поля из потока, как показано ниже:

  1 int blah (void)
  2 {
  3         if (foo) {
  4                 printf ("blah\n");
  5         }       
  6         return 0;
  7 }  

Я использую следующий код для удаления первого поля:

$ awk '{ $1="";print }' пример.out

 int blah (void)
 {
 if (foo) {
 printf ("blah\n");
 }
 return 0;
 }

Почему это так происходит?Это потому, что AWK удаляет все пробелы - можно ли это предотвратить?

Заранее с наилучшими пожеланиями

Это было полезно?

Решение

http://awk.freeshell.org/RangeOfFields

Содержит описание, как это сделать.Он также ссылается на http://student.northpark.edu/pemente/awk/awktail.txt который содержит 3 решения проблемы.Насколько я знаю, если вы присваиваете значение полю, то разделитель выходных полей используется для объединения всех полей вместе.Итак " "+ suddendly сворачивается в один пробел.Однако отнеситесь к этому с долей скептицизма, я не эксперт по awk.Например, попробуйте назначить : к переменной OFS, а двоеточия вместо пробелов приведут к разделению полей в выходных данных:

echo a b c | awk 'BEGIN{ OFS = ":" } { $1=""; print }'
$ :b:c

Если вы используете gawk, тогда вы можете использовать его gensub расширение, которое я нахожу довольно простым в использовании:

print gensub($1 "[\t ]*(.*)", "\\1", 1); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top