我正在为以下命令寻找其他替代方案/更智能的1个衬管,它应该为请求的列号添加一个值。 我尝试按照以下sed命令正常工作,将值4添加到第4列。 [需要:因为我有这样的文件,其中包含1000条记录&很多时候我需要在任何位置添加一列。] 我的approch仅适用于较小的规模。
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
事先坦克斯。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:2)
使用coreutils
和流程替换的一种方式:
f=1.txt
paste -d'|' \
<(cut -d'|' -f1-3 $f ) \
<(yes 4 | head -n`wc -l < $f`) \
<(cut -d'|' -f4- $f )
答案 3 :(得分:1)
一种方法,使用coreutils和进程替换:
sed 's/3|/3|4|/' 1.txt