Сохранение исходного формата СООБЩЕНИЯ, проходящего через AWK
-
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);