我想使用awk
作为我的解决方案来按行解析记录(循环到最大元素(最多NF
)),然后存储一些字段在 bash 变量中。我能够获得所需的记录,但无法避免 awk
打印
它自己的输出到 stdout
。
这是我采用的示例。
newvar=$(echo "Hello, this is a sentence with a few words." | awk '{ s = ""; for (i = 0; i <= 5; i++) s = s $i " "; print s }'
我想在 bash 变量 newvar
中存储“你好,这是一个句子”。尽管有更有效的方法可以做到这一点,但目前仅考虑使用 awk
的方法。
这会将输出存储为变量中的以下内容
Hello, this is a sentence with a few words. Hello, this is a sentence
我尝试通过执行 1>&-
将 stdout
抑制为 null
,
$ newvar=$(echo "Hello, this is a sentence with a few words." | awk '{ s = ""; for (i = 0; i <= 5; i++) s = s $i " "; print s }' 1>&- )
出现一个丑陋的错误,
awk: (FILENAME=- FNR=1) warning: error writing standard output (Bad file descriptor)
在此处或任何地方都无法找到有关如何执行此操作的合适答案。这甚至可以通过 awk
实现吗?如果找到重复的确切帖子,我们也将不胜感激!
最佳答案
这里的问题是您从 0 循环到 5。这意味着您将 $0
存储在变量 s
中,并且如您所知, $0
包含完整记录。这意味着您将存储完整记录,后跟前 5 个字段。
所以只需从 1 循环到 5:
$ awk '{s = ""; for (i = 1; i <= 5; i++) s = s $i " "; print s }' <<< "Hello, this is a sentence with a few words."
Hello, this is a sentence
请注意,没有必要在开始时将 s
设置为 ""
:任何变量在您开始使用时都会被设置。尽管您可能会使用它,因为您有多行,因此您需要在每条记录后重置其值。
话虽如此,如果您只想打印前 5 个单词,请使用 cut
:
$ cut -d' ' -f-5 <<< "Hello, this is a sentence with a few words."Hello, this is a sentence
关于bash - 需要让 awk 抑制输出到 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38052633/