gpt4 book ai didi

linux - shell如何为awk生成输入

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:07 35 4
gpt4 key购买 nike

假设我有一个 file1 包含:

1,2,3,4

我可以像这样使用 awk 来处理该文件;

awk -v FS="," '{print $1}' file1

我还可以使用 Here String 调用 awk,这意味着我从标准输入读取:

awk -v FS="," '{print $1}' <<<"9,10,11,12"

命令 1 产生结果 1,命令 2 产生预期的结果 9。

现在说我有第二个文件2:

4,5

如果我依次用 awk 解析这两个文件:

awk -v FS="," '{print $1}' file1 file2

我得到:

1
4

正如预期的那样。

但是如果我混合从标准输入读取文件,我从标准输入读取的内容会被忽略,只有文件中的内容会按顺序处理:

awk -v FS="," '{print $1}' file1 file2 <<<"9,10,11,12"
awk -v FS="," '{print $1}' file1 <<<"9,10,11,12" file2
awk -v FS="," '{print $1}' <<<"9,10,11,12" file1 file2

所有三个命令都会产生:

1
4

这意味着来自 stdin 的内容被简单地丢弃了。现在 shell 在做什么?

有趣的是,如果我将命令 3 更改为:

awk -v FS="," '{print $1}' <<<"9,10,11,12",file1,file2

我只是得到 9 ,这是有道理的,因为 file1/2 只是来自标准输入的另外两个字段。但是为什么呢

awk -v FS="," '{print $1}' <<<"9,10,11,12" file1 file2

未扩展到

awk -v FS="," '{print $1}' <<<"9,10,11,12 file1 file2"

这也会产生结果 9

为什么标准输入的内容会被忽略?命令 1 和命令 2 出现了同样的问题。shell 在这里做什么?

我尝试了以下命令:GNU bash,版本 4.2.53(1)-release

最佳答案

标准输入和来自文件的输入不能很好地混合在一起。此行为并非 awk 独有,你会在很多命令行应用程序中找到它。如果您这样想,这是合乎逻辑的:

文件需要一个一个地处理。消费应用程序无法控制 STDIN 后面的输入何时开始和停止。看echo a,b,c | awk -F, '{print $1}' file1 file2 .需要以什么顺序读取传入的"file"?当你想想什么时候FNR需要重置,或者什么FILENAME应该是,很明显很难做到这一点。

你可以玩的一个技巧是让awk (或任何其他程序)从 shell 生成的文件描述符中读取。 awk -F, '{print $1}' file1 <(echo 4,5,6) file2将首先按照您的预期进行。

这里发生的是,使用 <(...) 创建了一个正确的文件描述符语法(比如:/proc/self/fd/11),读取程序可以像对待文件一样对待它。它是第二个参数,所以它是第二个文件。 FNRFILENAME都清楚它们应该是什么。

关于linux - shell如何为awk生成输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920850/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com