Awk 需要修改我的输入文件吗

Awk 需要修改我的输入文件吗,awk,Awk,1-我有一个如下的输入文件,它有数百万条记录 w02_2017,1000550,10,0.76466668138703,0.96466668138703 w02_2017,10015774,10,3.878170108564,0.8634510325692 2-所以,我用bash编写了一个脚本,它有两个变量 + dt=02_2017 + dtid=20180217 3-所以,我循环这个 egrep -i $dt <input file> | sed -e "s/"$dt"/"$d

1-我有一个如下的输入文件,它有数百万条记录

w02_2017,1000550,10,0.76466668138703,0.96466668138703
w02_2017,10015774,10,3.878170108564,0.8634510325692
2-所以,我用bash编写了一个脚本,它有两个变量

+ dt=02_2017
+ dtid=20180217
3-所以,我循环这个

egrep -i $dt <input file> | sed -e "s/"$dt"/"$dtid"/g;s/w//g"
5.问题是上面的代码需要很长时间。我如何在
awk
中重新编写这篇文章,我相信这会快得多?
非常感谢您的帮助。

我相信
sed
在处理这么多记录时会比
awk
更快。然而,您正在进行可以在单个迭代中完成的多个迭代

$ dt="w02_2017"
$ dtid="20180217"
$ sed -i "s/$dt/$dtid/g" largeInputFile

以下
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 in place
,如下所示:

dt=02_2017
dtid=20180217
awk  -i inplace  -v dt_val="$dt" -v dtid_val="$dtid"  '{gsub(dt_val,dtid_val)} 1' Input_file
您的“so I loop this”语句似乎暗示您正在对
dt的多个值进行循环,并依次处理每个值。只需在读取
循环时删除
,并将逻辑放在
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
但第二,只需将其全部替换为单个
sed
脚本,并且只处理整个文件一次,不需要任何shell循环:

sed -e 's/02_2017/20180217/' \
    -e 's/one/eins/' \
    -e 's/two/zwei/' \
    -e 's/^w//' "$inputfile" >output

如果您只想打印发生替换的行,请查看
sed

中的
t
命令,您的目标是什么?提取和替换事件;或者重写整个文件以替换出现的内容?你试过sed-I-e“s/“$dt”/“$dtid”/g;s/w//g”
吗?请将你的示例输入和预期输出包装到代码标签中,你可以在发帖子时看到按钮
{}
。你说的是
我循环这个…
-你周围的代码中有没有一个循环没有展示给我们?如果是,请包括在内。您正在为旧字符串和新字符串使用变量-这是因为这些字符串发生了变化吗?如果是这样,请在问题描述和示例中包含该问题的详细信息。你越努力地问这个问题,你就越有可能得到正确的答案。对不起,没有具体说明。正如您所看到的,我正在从输入文件中对$dt的值进行grep,并且grep将旧字符串更改为新字符串的结果。是的,我正在将许多旧字符串循环到新字符串。这正是我所做的,但不确定使用awk是否会使进程运行得更快。删除shell循环并只处理一次文件将通过几个因素提高性能。相比之下,Awk和sed之间的速度差可以忽略不计。在普通情况下,
sed
可能会更快一点,因为它更简单,但有时会出现相反的情况,通常可以用Awk编写更智能的脚本。
while read dt dtid; do
    sed -n "/$dt/!d;s/$dt/$dtid/;s/^w//;p' "$inputfile"
...
sed -e 's/02_2017/20180217/' \
    -e 's/one/eins/' \
    -e 's/two/zwei/' \
    -e 's/^w//' "$inputfile" >output