AWK条件对大文件失败,但对较小文件有效

AWK条件对大文件失败,但对较小文件有效,awk,Awk,我有一个脚本,它比较两个文件,并在满足条件时输出值。如果我减少第二个文件中的记录,该脚本运行良好,但如果我使用具有100000条记录的实际文件,则该脚本失败。我可能做错了什么?这是我的密码 awk-F'|''NR==FNR{a[$1”|“$2]=$3}NR=FNR{if(exist a[$1”|“$3]){print“update inventory set amount=“a[$1”|“$3]”,其中balance_id=“$2”和balance_type_id=3019;“}}}}”cash

我有一个脚本,它比较两个文件,并在满足条件时输出值。如果我减少第二个文件中的记录,该脚本运行良好,但如果我使用具有100000条记录的实际文件,则该脚本失败。我可能做错了什么?这是我的密码

awk-F'|''NR==FNR{a[$1”|“$2]=$3}NR=FNR{if(exist a[$1”|“$3]){print“update inventory set amount=“a[$1”|“$3]”,其中balance_id=“$2”和balance_type_id=3019;“}}}}”cash.txt test.txt>update.sql

Cash.txt
0|3019|0
1|3019|1
2|3019|2
3|3019|3
4|3019|4
5|3019|5
6|3019|5

test.txt
0|0|3019
1|1|3019
2|2|3019
3|3|3019
4|4|3019
5|5|3019
6|6|3019
7|7|3019
8|8|3019
9|9|3019
10|10|3019
11|11|3019
12|12|3019




您可以尝试此
awk

awk-F'[|\r]''NR==FNR{
地图[$1”|“$2]=$3
下一个
}
$1“|”$3在地图中{
打印“更新库存集金额=“映射[$1”|“$3]”,其中余额id=“$2”和余额类型id=3019
}'cash.txt test.txt>update.sql
通过在第一个块中不使用
next
,awk正在评估
FNR!=NR
第一个文件中每个记录的条件,然后是第二个较大文件中每个记录的条件


另外,第二个块可以是map中的
$1“|”$3,这样我们只处理匹配的记录。

当我测试您尝试的代码时,它对我来说效果很好(在终端上打印内容),运行代码后您有什么错误吗?如果是,那么请在您的问题中提到这一点,这将帮助我们帮助您,谢谢。不,只是不为文件较大的实例编写sql文件。这就像我的脚本在处理小数据时工作得很好,但在处理大文件时会出现问题这可能会处理数十万条记录。请尝试一次并检查计时。您的两个输入文件中都有DOS换行符。为了解决这个问题,我修改了我的答案。使用此文件处理数据花费了
0.11秒
。@kevin:100k记录是AWK世界中的一个小文件。一旦我尝试在2018年macbook pro上推出mawk2,我就有了这个1.82 GB的flat.txt文件,其中包含了1250万行,通常有14列。我将FS改为普通的行内分隔符plus\n,并要求mawk2读取所有内容并拆分为字段。花了31秒左右的时间,完成了分割,还给了我173的NFmillion@kevin:如果你能。实际上,我建议在awk中进行任何大型数据分析。我的运行时解释的awk脚本执行URL编码/解码,这一事实胜过python3中的内置模块,或者awk脚本模拟cut将比macOS内部编译的二进制文件更快,或者tail,有时甚至是fgrep,告诉您需要知道的关于awk的绝对疯狂的一切(但这些只有使用mawk2 beta才能实现)(又名mawk 1.9.9.6)。gawk虽然很棒,但通常速度要慢得多,这主要是因为它的regex引擎存在速度差,。