awk命令会损失while的第一行

1.有一文本test.log,内容是:

1 a A
2 b B
3 c C

2.执行while得到正常输出

cat test.log |while read item;do echo $item;done
1 a A
2 b B
3 c C

3.但是执行while+awk会损失第一行

cat test.log |while read item;do awk '{print $1"A"}';done
2A
3A

一问:为什么会损失第一行数据?

二问:如何得到以下的输出?

1A
2A
3A
阅读 3.6k
2 个回答

awk 时不需要 while

cat test.log |awk ' {print $1"A"}'
1A
2A
3A

@Yujiaao 已经回答了你的二问,即如何得到正确输出。因为 awk 本来就可以循环处理所有分隔行(一般就是以 \n 为分隔的行),所以没有必要再使用 while 读取了。

也因此有了你 一问 的答案,为什么会少了一行:

你在 while 中使用了 read 命令,它可以从标准输入中读取内容,所以它把第一行读取到 item 变量中了。而 awk 在没有跟 文件参数 的时候,也会从标准输入里面读取内容,所以 awk 把剩余的内容读取并输出了。

此外,如果你使用 awk 的话,完全没有必要用 cat 读取文件内容,再通过管道给 awk;因为 awk 可以直接读取文件的:

awk ' {print $1"A"}' test.log
推荐问题