需要修改我的输入文件

时间:2018-02-16 01:19:16

标签: awk

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重写这个,我相信会更快?         任何帮助将不胜感激。

3 个答案:

答案 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命令。