bash - 需要让 awk 抑制输出到 stdout

标签 bash shell awk

我想使用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/

相关文章:

linux - 打印没有该列第一项的列

Bash - 解析 ini 文件,通过其中的值查找部分名称

bash - 递归查找文件类型列表

linux - 删除 shell 中以某个字符开头的行,但保留负值

linux - 通过从文本文件中读取文件名从目录中移动文件

bash - 在 shell 脚本中回显空白行的首选方法是什么?

linux - 使用 bash 获取特定列的总和?

bash - 在 bash 中循环遍历数字文本文件并按行添加数字

linux - 为几个用户验证 "su"的 Bash 脚本

linux - 在 bash 脚本中获取子字符串