Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在unix中[使用awk或sed]向文件中的任何位置添加列_Shell_Unix_Sed_Awk - Fatal编程技术网

Shell 在unix中[使用awk或sed]向文件中的任何位置添加列

Shell 在unix中[使用awk或sed]向文件中的任何位置添加列,shell,unix,sed,awk,Shell,Unix,Sed,Awk,我正在为下面的命令寻找其他替代方案/更智能的1行程序,它应该为请求的列号添加一个值。 我试着按照下面的sed命令正确地为第4列添加值4。 [需要:因为我有这样一个包含1000条记录的文件&很多时候,我需要在任何位置的中间添加一列。] 我的方法只适用于小规模 cat 1.txt 1|2|3|5 1|2|3|5 1|2|3|5 1|2|3|5 1|2|3|4|5 1|2|3|4|5 1|2|3|4|5 1|2|3|4|5 sed-i's/1 | 2 | 3 |/1 | 2 | 3 | 4 |/g

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

cat 1.txt

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

1|2|3|5
1|2|3|5
1|2|3|5
1|2|3|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
cat 1.txt

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

提前完成任务。

单向使用
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

字段分隔符

字符串串联

默认模式和操作


使用
coreutils
和过程替换的一种方法:

sed 's/3|/3|4|/' 1.txt
f=1.txt
粘贴-d'|'\

一种方法是使用coreutils和过程替换:

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

实际上,这个答案中没有过程替换。看起来你从中复制了该标题,可能没有理解它。(是否
sed
coreutil?)