【问题标题】:Looping over input fields as array将输入字段作为数组循环
【发布时间】:2011-10-23 06:28:21
【问题描述】:

是否可以这样做:

$ 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

但是结果不正常。

【问题讨论】:

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

标签: bash awk


【解决方案1】:

发现自己:

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

【讨论】:

  • 请注意,您可以删除for 中的大括号,因为您只执行一个命令。
【解决方案2】:

我会使用 sed:

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

【讨论】:

  • 不起作用,因为我需要操作 awk 中的分隔字段。或者我必须同时涉及 sed 和 awk
【解决方案3】:

如果您愿意使用 Perl,以下任何一种都可以解决问题:

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

使用这些命令行选项:

  • -n 循环输入文件的每一行,不要自动打印该行
  • -l 在处理之前删除换行符,然后将它们添加回
  • -a 自动拆分模式 - 将输入行拆分为 @F 数组。默认为空格分割。
  • -e执行perl代码

【讨论】:

    【解决方案4】:

    不需要awk、sed 或perl。您可以直接在 shell 中轻松地执行此操作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-08
      • 2020-09-11
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多