Awk 需要修改我的输入文件吗
1-我有一个如下的输入文件,它有数百万条记录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
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