awk + печатают все содержание строки кроме 1$

Я пишу follwoing awk сценарий:

% echo /var/sysconfig/network/my_functions  alpha beta gama  | \
      awk -v word=alpha '$2  == word { print $0 }'

как сказать awk, что я хочу распечатать всю строку кроме 1$ (/var/sysconfig/network/my_functions ПУТЬ), таким образом, я получу следующее:

alpha beta gama

вместо

/var/sysconfig/network/my_functions alpha beta gama

комментарий: содержание строки может быть чем-либо и не ограничить количеством строк/слова

5
задан 21.11.2010, 15:15

4 ответа

Я думаю в awk нет никакого пути, кроме как удалить первое поле вручную. (Существуют другие пути, если Вы готовы нормализовать межполевое пространство.)

awk '$2 == word {match($0, "("FS")+"); print substr($0, RSTART+RLENGTH);}'
1
ответ дан 07.12.2019, 17:13

Если Вы устанавливаете $1 кому: "" Вы оставите пространство разграничивания. Если Вы не хотите делать это, необходимо выполнить итерации по полям:

awk '{for (f=2; f<=NF; ++f) { if (f!=2) {printf("%s",OFS);} printf("%s",$f)}; printf "\n" }'

Править: зафиксированный на комментарий Gilles.

Другой способ сделать то же самое:

awk '{d = ""; for (f=2; f<=NF; ++f) {printf("%s%s", d, $f); d = OFS}; printf("\n") }'
6
ответ дан 07.12.2019, 17:13

Так или иначе я думаю, что это было бы настолько легче и более интуитивным, чтобы сделать с командой сокращения:

echo /var/sysconfig/network/my_functions  alpha beta gama | cut -d' ' -f 2-

Единственная проблема состоит в том, что сокращение не поддерживает несколько различных типов пробела сразу для разделителей. Таким образом, если у Вас будут пробелы или вкладки, то это не будет работать.

2
ответ дан 07.12.2019, 17:13
 % echo /var/sysconfig/network/my_functions  alpha beta gama | \
      awk -v word=alpha \
             '$2 == word { $1=""; print $0 }'
1
ответ дан 07.12.2019, 17:13

Теги

Похожие вопросы