2011-08-09 41 views
18

是否有可能做这样的事情:循环在输入字段阵列

$ 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 

但随后的结果是不是为了。

+0

是的,关联数组是无序集合。 –

回答

40

找到了自己:

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

注意你可以在'for'中删除大括号,因为你只执行一个命令。 – fedorqui

1

我会使用SED:

sed 's/\ /\n/g' foo.txt 
+0

不起作用,因为我需要操纵awk中的分隔字段。或者我必须都涉及sed和awk – Tyilo

0

如果你打开使用Perl,无论这些应该做的伎俩:

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

使用以下命令行选项:

  • -n围绕输入文件的每行循环,不自动打印线
  • -l处理之前去除换行符,并把它们放回事后
  • -a自动分割模式 - 分裂输入线到@F阵列。默认分割为空格。
  • -e执行Perl代码
0

无需awksedperl。您可以直接在shell中直接执行此操作:

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