如何替换文件中的多列?
How to replace multiple columns in a file?
假设我有一个文件,我想用 AAAA 替换第 1、3 和 5 列,该文件由 |
(竖线)分隔。
到目前为止,我正在使用 for 循环来执行此操作,但我认为这消耗了大量 space,因为我在将每列替换后的结果复制到一个临时文件(输入文件的文件名很大)
ARRAY=(1,3, 5)
for i in ${ARRAY[@]}
do
sed "s/[^|]*/AAAA/$i" filename >> /tmp/tempfile
cp /tmp/tempfile filename
rm /tmp/tmpfile
done
请提出更聪明的方法
你为什么不为此使用 awk
?直截了当:
awk -v repl="AAAA" 'BEGIN{FS=OFS="|"} {===repl}1' file > new_file
测试
$ cat a
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
$ awk -v repl="AAAA" 'BEGIN{FS=OFS="|"} {===repl}1' a
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
通用到多个列(在 Col 中设置)和模式替换(在 Pat 中插入)
awk -v 'Col=1,3,5' -v 'Pat=AAAA' 'BEGIN{OFS=FS="|"} {for(i=1;i<=NF;i++) if( ","Col"," ~ ","i",")$i=Pat;print}' YourFile > NewFile
假设我有一个文件,我想用 AAAA 替换第 1、3 和 5 列,该文件由 |
(竖线)分隔。
到目前为止,我正在使用 for 循环来执行此操作,但我认为这消耗了大量 space,因为我在将每列替换后的结果复制到一个临时文件(输入文件的文件名很大)
ARRAY=(1,3, 5)
for i in ${ARRAY[@]}
do
sed "s/[^|]*/AAAA/$i" filename >> /tmp/tempfile
cp /tmp/tempfile filename
rm /tmp/tmpfile
done
请提出更聪明的方法
你为什么不为此使用 awk
?直截了当:
awk -v repl="AAAA" 'BEGIN{FS=OFS="|"} {===repl}1' file > new_file
测试
$ cat a
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
1|2|3|4|5|6|7|8
$ awk -v repl="AAAA" 'BEGIN{FS=OFS="|"} {===repl}1' a
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
AAAA|2|AAAA|4|AAAA|6|7|8
通用到多个列(在 Col 中设置)和模式替换(在 Pat 中插入)
awk -v 'Col=1,3,5' -v 'Pat=AAAA' 'BEGIN{OFS=FS="|"} {for(i=1;i<=NF;i++) if( ","Col"," ~ ","i",")$i=Pat;print}' YourFile > NewFile