1 - 我的输入文件如下,有数百万条记录
w02_2017,1000550,10,0.76466668138703,0.96466668138703
w02_2017,10015774,10,3.878170108564,0.8634510325692
2 - 所以,我在bash中编写了一个包含2个变量的脚本
+ dt=02_2017
+ dtid=20180217
3 - 所以,我通过
循环egrep -i $dt <input file> | sed -e "s/"$dt"/"$dtid"/g;s/w//g"
4 - 我得到了如下所需的输出
20180217,1000550,10,0.76466668138703,0.96466668138703
20180217,10015774,10,3.878170108564,0.8634510325692
5.问题是上面的代码需要很长时间。我如何在awk
重写这个,我相信会更快?
任何帮助将不胜感激。
答案 0 :(得分:2)
我相信sed
在处理这么多记录时会比awk
更快。然而,您正在进行多次迭代,可以在一次迭代中完成。
$ dt="w02_2017"
$ dtid="20180217"
$ sed -i "s/$dt/$dtid/g" largeInputFile
答案 1 :(得分:2)
关注awk
可能对您有所帮助:
dt=02_2017
dtid=20180217
awk -v dt_val="$dt" -v dtid_val="$dtid" '{gsub(dt_val,dtid_val)} 1' Input_file > temp_file && mv temp_file Input_file
由于我的awk
是旧版本,所以我在上面使用,如果您的awk
版本较新,那么awk
的选项-i inplace
也可以如下:
dt=02_2017
dtid=20180217
awk -i inplace -v dt_val="$dt" -v dtid_val="$dtid" '{gsub(dt_val,dtid_val)} 1' Input_file
答案 2 :(得分:1)
你的“我循环这个”语句似乎暗示你正在循环多个dt
值并依次处理每个值。只需删除while read
循环,然后将逻辑放在sed
脚本中;并且只处理一次文件。
如果你有
while read dt dtid; do
egrep "$dt" "$inputfile" | sed "s/$dt/$dtid/;s/^w//"
done <<'____HERE' >output
02_2017 20180217
one eins
two zwei
____HERE
你可以先重构以避免使用useless use of grep
(并注意几十年前POSIX基本上用egrep
取代grep -E
):
while read dt dtid; do
sed -n "/$dt/!d;s/$dt/$dtid/;s/^w//;p' "$inputfile"
...
但其次只需用一个sed
脚本替换它,并且只处理整个文件一次,没有任何shell循环:
sed -e 's/02_2017/20180217/' \
-e 's/one/eins/' \
-e 's/two/zwei/' \
-e 's/^w//' "$inputfile" >output
如果您只想打印发生替换的行,请查看t
中的sed
命令。