【问题标题】:Add string to columns in bash将字符串添加到bash中的列
【发布时间】:2019-06-12 15:35:32
【问题描述】:

我有一个逗号分隔的文件,我想在特定列中附加一个字符串。我正在尝试to do something like this,但直到现在都做不到。

re1,1,a1e,a2e,AGT
re2,2,a1w,a2w,AGT
re3,3,a1t,a2t,ACGTCA
re12,4,b1e,b2e,ACGTACT

我想将“some_string”附加到第 3 列和第 4 列:

re1,1,some_stringa1e,some_stringa2e,AGT
re2,2,some_stringa1w,some_stringa2w,AGT
re3,3,some_stringa1t,some_stringa2t,ACGTCA
re12,4,some_stringb1e,some_stringb2e,ACGTACT

我正在尝试类似于建议解决方案的方法,但无济于事:

awk -v OFS=$'\,' '{ $3="some_string" $3; print}' $lookup_file

另外,我希望将我的字符串添加到两列中。您将如何使用 awk 或 bash 来做到这一点?

提前非常感谢

【问题讨论】:

  • 为什么标记 bash 而不是 awk?
  • @ctac_ 我现在添加了 awk 标签。我最初的想法不是专门针对 awk,而是针对 awk 或 bash。

标签: bash awk


【解决方案1】:

你可以用(几乎)你所拥有的东西来做到这一点:

pax> echo 're1,1,a1e,a2e,AGT
re2,2,a1w,a2w,AGT
re3,3,a1t,a2t,ACGTCA
re12,4,b1e,b2e,ACGTACT' | awk 'BEGIN{FS=OFS=","}{$3 = "pre3:"$3; $4 = "pre4:"$4; print}'

re1,1,pre3:a1e,pre4:a2e,AGT
re2,2,pre3:a1w,pre4:a2w,AGT
re3,3,pre3:a1t,pre4:a2t,ACGTCA
re12,4,pre3:b1e,pre4:b2e,ACGTACT

begin 块设置输入和输出字段分隔符,两个分配消息字段 3 和 4,print 输出修改后的行。

【讨论】:

    【解决方案2】:

    您需要将FS 设置为逗号,而不仅仅是OFS。有一个设置FS的快捷方式,就是-F选项。

    awk -F, -v OFS=',' '{ $3="some_string" $3; $4 = "some_string" $4; print}' "$lookup_file"
    

    【讨论】:

    • IFSbash 的东西,而不是 awk 的东西。在awk 中,输入字段分隔符就是FS。这并不意味着您的解决方案是错误的,只是您使用了错误的术语。
    • @paxdiablo 谢谢。因为我几乎总是使用-F,所以我从来不用处理实际的变量名。
    • 非常感谢@paxdiablo 和@Barmar。我想知道,如果要添加的字符串有单引号怎么办?我试过"\'",但它不起作用
    • 没关系,我在hereawk -F"," -v quote="'" -v OFS="','" '{print quote $3,$4 quote}' $lookup_file找到它
    【解决方案3】:

    awk 的默认操作是连接,因此您可以简单地将字符串彼此相邻放置,它们将被视为一个。 1 表示为真,因此如果没有{action},它将假定为“打印”。您可以使用 Bash 的 Brace Expansion 在脚本之后分配多个变量。

    awk '{$3 = "three" $3; $4 = "four" $4} 1' {O,}FS=,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多