awk '{printf $0"\t"}' | awk '{print $0}' 输出会自动换行?

2016-01-09 15:41:18 +08:00
 Counter
假设原本 sh test.sh 输出为:
aaaaabbbbb
cccccddddd <---输出两行结束

执行下面语句 1:
sh test.sh | awk '{printf $0"\t"}'
输出为:(为了清楚,这里用____表示\t)
aaaaabbbbb____cccccddddd____username@host: <---注意这里没换行

执行下面语句 2:
sh test.sh | awk '{printf $0"\t"}' | awk '{print $0}'
输出为:(为了清楚,这里用____表示\t)
aaaaabbbbb____cccccddddd____ <---注意这里换行了
username@host:

请问为什么会这样呢?
16798 次点击
所在节点    Linux
8 条回复
jalena
2016-01-09 16:56:07 +08:00
\n
ynyounuo
2016-01-09 16:57:16 +08:00
amghost
2016-01-09 17:12:49 +08:00
一个是 printf ,一个是 print
printf 不带换行, print 默认会输出换行
Delbert
2016-01-09 17:15:14 +08:00
搜索一下不就有了吗?
一个 printf 一个 print
http://bbs.chinaunix.net/thread-1437213-1-1.html
shell 的 print??
你是指 awk 的 print 和 printf 吧
print 输出指定内容后换行, printf 只输出指定内容后不换行
Counter
2016-01-09 17:35:11 +08:00
@Delbert
@amghost
原来是我漏看了,还研究了半天
KentY
2016-01-09 23:56:12 +08:00
@ynyounuo 怎么 @我了?

print 并不是输出内容并换行, 只是缺省换行.
在 awk 里, print 和 printf 的区别是, print 输出当前记录(行 record), 并在最后自动加上 ORS ( 默认是\n ,但可以是任何字符串). 而 printf 是按给定格式输出内容, 你给它 ORS 参数, 它就输出 ORS, 没给就不输出.

有一点要注意的, 类似 printf $0 这种应该在实际代码中避免. 要写 printf "%s", $0 看起来繁琐, 但是一旦$0 里包含%, 代码就容易出错.如果使用了 printf, 就要用格式和参数形式.

my 2 cents
KentY
2016-01-09 23:57:56 +08:00
上面内容 :

"但是" 一旦$0 里包含%,

里的"但是"是多余的, 应该删掉. sorry.
ynyounuo
2016-01-10 05:30:18 +08:00
@KentY 看到 awk 的自然反应

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/249518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX