awk命令会损失while的第一行

bravility
  • 239

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
回复
阅读 2.3k
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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏