5

我正在为以下命令寻找其他替代方案/更智能的 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

提前谢谢。

4

4 回答 4

11

字段分隔符
http://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html

字符串连接
http://www.gnu.org/software/gawk/manual/html_node/Concatenation.html

默认模式和操作
http://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html

 awk -v FS='|' -v OFS='|' '{$3=$3"|"4} 1' 1.txt
于 2012-07-24T09:32:29.187 回答
7

一种使用方式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
于 2012-07-24T09:18:50.343 回答
2

一种使用coreutils和处理替换的方法:

f=1.txt
paste -d'|'                       \
  <(cut -d'|' -f1-3 $f          ) \
  <(yes  4 | head -n`wc -l < $f`) \
  <(cut -d'|' -f4- $f           )
于 2012-07-24T09:42:52.607 回答
1

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

sed 's/3|/3|4|/' 1.txt
于 2012-08-03T11:59:49.037 回答