【问题标题】:Awk Printf result of a subtraction between column and fixed value列和固定值之间减法的 awk Printf 结果
【发布时间】:2017-05-09 16:57:46
【问题描述】:

假设我有:

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 命令现在正在工作。

【问题讨论】:

  • 你可以试试awk '{print $1, $2-1, $3, $4}' yourfile
  • 不可能从你说你运行的命令中得到你说你做的输出。 edit您的问题是显示您真正运行以产生该输出的命令,并显示您真正从该命令获得的输出。我怀疑,这样做会告诉你问题的答案。
  • 嗨,Ed,我确实犯了一个小错误:printf 格式的结尾不是 "\t" 而是 "\n" 。所以我要编辑它。也许如果你在这个修改之后没有得到好的结果,那是因为我只描述了我的脚本的 awk 部分,因为问题来自那里。你说得对,我不明白,但我的 awk 命令现在正在工作!谢谢。

标签: awk printf


【解决方案1】:

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

,即可更简单
awk 'BEGIN{FS=OFS="\t"}{$2=$2-1}1' file

这里根本不需要printf。设置字段分隔符后,可以通过$1..$NF 访问各个字段。由于我们关心的值在$2,所以减一即可。

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

【讨论】:

  • 做得很好,尽管值得注意的是,基于OFS 的输出行的(重新)构造发生在分配到字段变量(@987654332 @ 在这种情况下)。 $2 -= 1$2-- 也可以。
【解决方案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"}

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2022-08-06
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多