web-dev-qa-db-ja.com

入力フィールドを配列としてループする

このようなことをすることは可能ですか?

$ 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

しかし、その結果はまちがっています。

27
Tyilo

私自身が見つかりました:

$ awk '{ for(i = 1; i <= NF; i++) { print $i; } }' foo.txt
59
Tyilo

awksedPerlは必要ありません。これはシェルで直接簡単に行うことができます。

for i in $(cat foo.txt); do echo "$i"; done
1
Sven Marnach

私はsedを使用します:

sed 's/\ /\n/g' foo.txt
1
dala

Perlを使用することにオープンであれば、次のいずれかでうまくいくはずです。

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

次のコマンドラインオプションが使用されます。

  • -n入力ファイルの各行をループし、自動的に行を出力しません
  • -lは、処理前に改行を削除し、後で追加し直します
  • -a autosplitモード–入力行を@F配列に分割します。デフォルトでは空白で分割されます。
  • -e Perlコードを実行します
0
Chris Koknat