Зацикливание полей ввода в виде массива

19

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

$ 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(%pre%,array," "); for(i in array){ print array[i]; } }' foo.txt
2
3
4
1
bar
baz
foo
world
hello

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

    
задан Tyilo 09.08.2011 в 16:04
источник
  • Да, ассоциативные массивы представляют собой неупорядоченные коллекции. –  glenn jackman 09.08.2011 в 16:16

4 ответа

42

Нашел сам:

$ awk '{ for(i = 1; i <= NF; i++) { print $i; } }' foo.txt
    
ответ дан Tyilo 09.08.2011 в 16:08
источник
  • Обратите внимание, что вы можете удалить фигурные скобки, поскольку вы выполняете только одну команду. –  fedorqui 13.06.2016 в 13:16
1

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

sed 's/\ /\n/g' foo.txt
    
ответ дан dala 09.08.2011 в 16:09
источник
  • Не работает, потому что мне нужно манипулировать разделенными полями в awk. Или тогда я должен оба включить sed и awk –  Tyilo 09.08.2011 в 16:44
1

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

for i in $(cat foo.txt); do echo "$i"; done
    
ответ дан Sven Marnach 07.09.2017 в 16:59
источник
0

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

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

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

  • -n перемещается вокруг каждой строки входного файла, не печатайте автоматически строку
  • -l удаляет новые строки перед обработкой и затем добавляет их обратно
  • -a autosplit mode - разделение входных строк на массив @F . По умолчанию разбивается на пробелы.
  • -e выполнить код perl
ответ дан Chris Koknat 15.09.2015 в 18:55
источник