我们说我有:
David 1500 2338 Baker
Danny 1290 1550 Bold
Domminic 25 28 Baker
所以有4个以制表符分隔的列。所有列的大小可能会有很大差异。 我想要的是使用awk printf做的解决方案:每行$ 2 - 1。 这是我想要的结果:
David 1499 2338 Baker
Danny 1289 1550 Bold
Domminic 24 28 Baker
最后这是我到目前为止所做的事情:
awk '{if($0 ~/^D/) \
{printf ("%s\t%d\t%d\t%s\n",$1,($2 - 1),$3,$4)}}'
显然,如果我问这个问题,那是因为我没有得到预期的结果。这就是我获得的:
David 1500-1 2338 Baker
Danny 1290-1 1550 Bold
Domminic 25-1 28 Baker
我尝试了其他的东西,但是效果并不好......对于我来说,使用printf在awk中获得解决方案非常重要。 "帮助我obi wan kenobi你是我唯一的希望"!
编辑:我在printf"格式"中犯了一个小错误。部分,最后\ t应该是\ n。 然后问题就解决了我不明白为什么我之前会遇到这个错误。非常感谢Ed的帮助(见评论)。 awk命令现在正在运行。
答案 0 :(得分:3)
通过将输入和输出字段分隔符设置为 Tab 并将$2
值修改为
awk 'BEGIN{FS=OFS="\t"}{$2=$2-1}1' file
这里根本不需要printf
。设置字段分隔符后,可以将$1
.. $NF
作为单个字段进行访问。由于我们关注的值是$2
,只需从中减去一个。
默认的print
操作(始终为真实模式1
隐含)将根据输出字段分隔符(OFS
)设置从字段重建输出行。
由于我们仅在此处修改$2
,因此其他字段保持不变。
答案 1 :(得分:2)
这是另一个awk
$ awk '/^D/{$2--}1' file | column -t
David 1499 2338 Baker
Danny 1289 1550 Bold
Domminic 24 28 Baker
或,为表格输入/输出添加BEGIN{FS=OFS="\t"}
。