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

Awk Printf列和固定值之间的减法结果,awk,printf,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

假设我有:

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中获得解决方案对我来说真的很重要。 “救救我,欧比-万·克诺比,你是我唯一的希望”

编辑:我在printf“格式”部分犯了一个小错误,最后一个\t应该是一个\n。 然后问题就解决了,我不明白为什么我以前会犯这个错误。非常感谢Ed的帮助(见评论)。awk命令现在正在工作

只需将输入和输出字段分隔符设置为Tab并将
$2
值修改为

awk 'BEGIN{FS=OFS="\t"}{$2=$2-1}1' file
这里根本不需要
printf
。设置字段分隔符后,可以通过
$1
访问各个字段。
$NF
。因为我们关心的值是2美元,所以只需从中减去1即可

默认的
print
操作(由始终为真模式
1
)将根据设置的输出字段分隔符(
OFS
)从字段重建输出行。
因为我们在这里只修改了
$2
,其他字段保持不变。

只需将输入和输出字段分隔符设置为Tab并将
$2
值修改为

awk 'BEGIN{FS=OFS="\t"}{$2=$2-1}1' file
这里根本不需要
printf
。设置字段分隔符后,可以通过
$1
访问各个字段。
$NF
。因为我们关心的值是2美元,所以只需从中减去1即可

默认的
print
操作(由始终为真模式
1
)将根据设置的输出字段分隔符(
OFS
)从字段重建输出行。

因为我们在这里只修改了
$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”}

这里是另一个
awk

$ awk '/^D/{$2--}1' file | column -t

David     1499  2338  Baker
Danny     1289  1550  Bold
Domminic  24    28    Baker

或者,为表格输入/输出添加
BEGIN{FS=OFS=“\t”}

您可以尝试
awk'{print$1,$2-1,$3,$4}'您的文件
无法从您说运行的命令中获得您说的输出。您的问题是如何显示为生成该输出而实际运行的命令,以及如何显示从该命令中实际获得的输出。我想,这样做会给你一个问题的答案。嗨,埃德,我确实犯了一个小错误:printf格式的结尾不是“\t”,而是“\n”。所以我要编辑它。也许,如果你在这次修改后没有得到好的结果,那是因为我只描述了我脚本中的awk部分,因为问题就出在那里。你是对的,我不明白,但我的awk命令现在起作用了!谢谢。您可以尝试
awk'{print$1,$2-1,$3,$4}您的文件
无法从您所说运行的命令中获取您所说的输出。您的问题是如何显示为生成该输出而实际运行的命令,以及如何显示从该命令中实际获得的输出。我想,这样做会给你一个问题的答案。嗨,埃德,我确实犯了一个小错误:printf格式的结尾不是“\t”,而是“\n”。所以我要编辑它。也许,如果你在这次修改后没有得到好的结果,那是因为我只描述了我脚本中的awk部分,因为问题就出在那里。你是对的,我不明白,但我的awk命令现在起作用了!谢谢。做得很好,不过值得注意的是,基于
OFS
的输出行(重新)构造发生在分配给字段变量时(在本例中为
$2
$2-=1
$2--
也可以。做得很好,不过值得注意的是,基于OFS
的输出行的(重新)构造发生在分配给字段变量时(
$2
)<代码>$2-=1
$2--
也可以。