Цикл по полям ввода в виде массива - PullRequest
26 голосов
/ 09 августа 2011

Можно ли сделать что-то вроде этого:

$ cat foo.txt
1 2 3 4
foo bar baz
hello world
$ awk '{ for(i in $){ print $[i]; } }' foo.txt
1
2
3
4
foo
bar
baz
hello
world

Я знаю, что вы могли бы сделать это:

$ awk '{ split($0,array," "); for(i in array){ print array[i]; } }' foo.txt
2
3
4
1
bar
baz
foo
world
hello

Но тогда результат не в порядке.

Ответы [ 4 ]

56 голосов
/ 09 августа 2011

Сам узнал:

$ awk '{ for(i = 1; i <= NF; i++) { print $i; } }' foo.txt
1 голос
/ 07 сентября 2017

Нет необходимости в awk, sed или perl. Вы можете легко сделать это прямо в оболочке:

for i in $(cat foo.txt); do echo "$i"; done
1 голос
/ 09 августа 2011

Я бы использовал sed:

sed 's/\ /\n/g' foo.txt
0 голосов
/ 15 сентября 2015

Если вы открыты для использования Perl, любой из них должен сделать свое дело:

perl -lane 'print $_ for @F' foo.txt
perl -lane 'print join "\n",@F' foo.txt

Эти параметры командной строки используются:

  • -n loopвокруг каждой строки входного файла не печатать автоматически строку
  • -l удаляет новые строки перед обработкой и добавляет их впоследствии
  • -a режим автоматического разделения - разбивает входные строки намассив @F.По умолчанию расщепление по пробелам.
  • -e выполнить код perl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...