读取文件并将其通过管道传输到awk不会打印预期的结果

时间:2019-02-07 20:17:50

标签: bash awk

如果我有文件test.txt包含3行;

1  
2   
3

如果我运行

cat test.txt| while read a ; do awk -v c=$a '{print c}' ;done

它将打印这些值。

1  
1

但是如果我运行

cat test.txt| awk '{a=$0; print a}'
它将表现出预期的效果。

1  
2   
3

有什么解释吗?

谢谢

2 个答案:

答案 0 :(得分:0)

在您的第一个版本awk中,stdin没有达到您的预期。

从@William Purcell的注释中复制:“ read命令读取输入的第一行,而awk读取接下来的2行(2和3)。这就是为什么看到两行输出的原因。”

对于接下来的两行,您已经使用c(从第一次读取开始)初始化了1变量。

如果将语句包装在BEGIN块中,它将按预期工作。

$ seq 3 | while IFS= read -r a; do awk -v c="$a" 'BEGIN{print c}'; done

但是,这是做事效率低下的方式。

答案 1 :(得分:0)

awk从已设置的变量而不是从stdin中读取。

seq 3 | while IFS= read -r a; do awk '{print}' <<<"$a"; done