【问题标题】:How to append to the lines with fewer columns in a tab separated text file?如何附加到制表符分隔的文本文件中列较少的行?
【发布时间】:2017-05-09 21:03:29
【问题描述】:

我有一个制表符分隔的文本文件。有些行有 10 列,有些行有 11 列。我想在值为 0 的 10 列行的最后一列中添加一个额外的列。我该怎么做?

【问题讨论】:

    标签: bash text awk sed text-processing


    【解决方案1】:

    既然你提到了追加,你可以awk如下

    awk -F $'\t' 'BEGIN {OFS = FS} NF==10{$0=$0"0"}1' input-file
    

    -F $'\t' 负责制表符分隔部分,BEGIN {OFS = FS} 用于设置输出字段分隔。

    NF==10 仅查找只有 10 条记录的行,{$0=$0"0"}1 用于重建添加了额外单词的行。

    要写入单独的文件,请使用 > 重定向运算符作为

    awk -F $'\t' 'BEGIN {OFS = FS} NF==10{$0=$0"0"}1' input-file > output-file
    

    要替换原始文件,请使用mv

    awk -F $'\t' 'BEGIN {OFS = FS} NF==10{$0=$0"0"}1' input-file > output-file ; mv output-file input-file
    

    或者如果你有最新的GNU Awk(自4.1.0发布),它有“就地”文件编辑的选项:

    gawk -i inplace -F $'\t' 'BEGIN {OFS = FS} NF==10{$0=$0"0"}1' input-file
    

    【讨论】:

    • 如果我运行这个命令会修改文件吗?或者我应该保存这个命令的输出?因为当我完全粘贴此命令时,它开始在 bash 上显示内容
    • @RaminZahedi:参考我的更新,它告诉你如何保存到新文件
    • 其实我不想保存到新文件,我想修改这个文件。如果第一个命令只是修改了输入文件,为什么它会将内容输出到 shell?
    • @RaminZahedi awk 默认情况下不进行就地编辑。它只是写入标准输出。要进行就地编辑,您需要使用 gawk。你的要求是什么?使用同一个文件?
    • 我的文件是一个 30 GB 的文本文件,我想将它导入到 postgresql 表中。但是由于对于某些行缺少最后一列,我想在导入之前修改文件,所以,我可以只修改这一列还是应该将输出保存到新的?
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -r 's/[^\t]+/&/11;t;s/$/\t0/' file
    

    这会用它自己替换第十一列,否则它会添加一个选项卡,然后添加0

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      相关资源
      最近更新 更多