【问题标题】:Add a column to any position in a file in unix [using awk or sed]在 unix 文件中的任何位置添加一列 [使用 awk 或 sed]
【发布时间】:2012-07-24 08:53:44
【问题描述】:

我正在为以下命令寻找其他替代方案/更智能的 1 行,它应该为请求的列号添加一个值。 我尝试按照以下 sed 命令正常工作,将值 4 添加到第 4 列。 [需要:因为我有这样的文件,其中包含 1000 条记录,并且很多时候我需要在任何位置之间添加一列。] 我的方法只适用于较小的规模。

cat 1.txt

1|2|3|5
1|2|3|5
1|2|3|5
1|2|3|5

sed -i 's/1|2|3|/1|2|3|4|/g' 1.txt

cat 1.txt

1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5

提前谢谢。

【问题讨论】:

    标签: shell unix sed awk


    【解决方案1】:
    【解决方案2】:

    使用awk 的一种方式。将两个参数传递给脚本,列号和要插入的值。该脚本会增加字段的数量 (NF) 并遍历最后一个字段,直到指定的位置并在那里插入新值。

    运行这个命令:

    awk -v column=4 -v value="four" '
        BEGIN {
            FS = OFS = "|";
        }
        {
            for ( i = NF + 1; i > column; i-- ) {
                $i = $(i-1);
            }
            $i = value;
            print $0;
        }
    ' 1.txt
    

    输出如下:

    1|2|3|four|5
    1|2|3|four|5
    1|2|3|four|5
    1|2|3|four|5
    

    【讨论】:

      【解决方案3】:

      使用coreutils 和进程替换的一种方式:

      f=1.txt
      paste -d'|'                       \
        <(cut -d'|' -f1-3 $f          ) \
        <(yes  4 | head -n`wc -l < $f`) \
        <(cut -d'|' -f4- $f           )
      

      【讨论】:

        【解决方案4】:

        一种方法,使用 coreutils 和进程替换:

        sed 's/3|/3|4|/' 1.txt
        

        【讨论】:

        • 实际上这个答案中没有进程替换。看起来您从 another answer 复制了该标头,可能没有理解它。 (sed 是 coreutil 吗?)
        猜你喜欢
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多