【问题标题】:awk for loops on the associative arrayawk for 关联数组上的循环
【发布时间】:2021-10-04 08:41:27
【问题描述】:

以下代码仅打印行 ab 忽略 c

awk '{a[$0]} END {for(i in a) for(j in a) for(k in a) print i, j, k}' < <(echo -e 'a\nb\c\n')

output:
a a a
a a b
a b a
a b b
b a a
b a b
b b a
b b b

在上面的代码中需要改变什么,以便 c 行进入输出排列?

【问题讨论】:

  • 不可重现:ideone.com/o0cCWU
  • @blhsing:这是可重现的,您没有运行 OP 使用的确切命令。只需使用awk '1' &lt; &lt;(echo -e 'a\nb\c\n'),您就会看到相同的行为。
  • @anubhava 我现在看到是 \c 的拼写错误导致了这种行为。将维持我的投票结束这个问题,因为“不可重现”和“错字”被归为同一个关闭选项。
  • 是的,这是您的电话,但 jfyi 修复错字也不会产生预期的结果。只需使用 &lt; &lt;(echo -e 'a\nb\nc\n') 运行 OP 的命令
  • 检查输入应该始终是调试不良输出的第一步。 echo -e 'a\nb\c\n' 是否产生您期望的输出?无论如何,而不是硬编码循环,请参阅stackoverflow.com/a/56916316/1745001 了解如何打印输入字符串的所有排列(和组合)。

标签: awk associative-array


【解决方案1】:

您不需要使用进程替换。只需使用这样的此处字符串:

awk '{a[$0]} END {for(i in a) for(j in a) for(k in a) print i, j, k}' <<< $'a\nb\nc'

a a a
a a b
a a c
a b a
a b b
a b c
a c a
a c b
a c c
b a a
b a b
b a c
b b a
b b b
b b c
b c a
b c b
b c c
c a a
c a b
c a c
c b a
c b b
c b c
c c a
c c b
c c c

请注意printf 更便携和一致,因此最好使用&lt; &lt;(printf 'a\nb\nc\n') 而不是echo -e

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多