Сохранение оригинального формата POST, проходящего через AWK - PullRequest
3 голосов
/ 03 января 2009

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

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

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

$ awk '{$ 1 = ""; print} 'example.out

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

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

С уважением, заранее

1 Ответ

2 голосов
/ 03 января 2009

http://awk.freeshell.org/RangeOfFields

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

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

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

print gensub($1 "[\t ]*(.*)", "\\1", 1); 
...