Awk Printf在列和固定值之间进行减法的结果

时间:2017-05-09 16:57:47

标签: awk printf

我们说我有:

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命令现在正在运行。

2 个答案:

答案 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"}