我有一个文件data.base,如下所示:
1234 XXXX
4321 XXXX
9884 ZZZZ
5454 YYYY
4311 YYYY
9882 ZZZZ
9976 ZZZZ
(......这样的随机事件直到10000行)
我想创建一个名为data.case的文件,它从data.base派生,只是替换了XXXX,YYYY,ZZZZ的浮点数。
我想知道在bash或朋友身上做到这一点最紧凑/最有效/最短的方法。
我通常做的是:
sed -e "s/XXXX/1.34555/g" data.base > temp1
sed -e "s/YYYY/2.985/g" temp1 > temp2
sed -e "s/ZZZZ/-4.3435/g" temp2 > data.case
rm -fr temp1 temp2
但是当我不得不处理超过3次替换时,我认为这不是最紧凑或最有效的方法。
由于
由于
答案 0 :(得分:4)
使用选项在同一个sed中执行多个命令:
sed "s/XXXX/1.34555/g; s/YYYY/2.985/g"; s/ZZZZ/-4.3435/g" data.base > data.case
答案 1 :(得分:2)
$ cat sedcommands
s/XXXX/1.34555/g
s/YYYY/2.985/g
s/ZZZZ/-4.3435/g
$ sed -f sedcommands data.base > data.case
答案 2 :(得分:1)
你可以在awk中使用关联数组
awk 'BEGIN{
# add as needed
s["XXXX"]=1.3455
s["YYYY"]=2.985
s["ZZZZ"]=-4.3435
}
($2 in s) { print $1,s[$2] }' file
输出
$ ./shell.sh
1234 1.3455
4321 1.3455
9884 -4.3435
5454 2.985
4311 2.985
9882 -4.3435
9976 -4.3435
答案 3 :(得分:0)
sed -e“s / XXXX / 1.34555 / g; s / YYYY / 2.985 / g; s / ZZZZ / -4.3435 / g”
或将它们放在cmd文件中 并列出来。
答案 4 :(得分:0)
虽然sed
可以在一次传递中执行多次替换,但 general UNIX approach更广泛适用且可与其他命令结合使用使用命令管道:
cat data.base | \
sed -e "s/XXXX/1.34555/g" | \
sed -e "s/YYYY/2.985/g" | \
sed -e "s/ZZZZ/-4.3435/g" > data.base
最后的重定向将“unlink
”cat
用作输入的旧data.base;但是,您仍然可以使用临时文件,以便您可以拦截错误条件,而不会丢失原始data.base。
(使用管道时,熟悉tee
程序非常有用,该程序在将文件传递给文件的同时将其保存到文件中。