Awk对可以处理的数据量有限制吗?
for i in "052" "064" "060" "070" "074" "076" "178"
do
awk -v f="${i}" -F, 'match ($1,f) { print $2","$3 }' uls.csv > ul$i.csv
awk -v f="${i}" -F, 'match ($1,f) { print $2","$3 }' dls.csv > dl$i.csv
awk -v n="${i}" -F, 'match ($1,n) { print $2","$3 }' dlsur.csv >> dlu$i.csv
awk -v k="${i}" -F, 'match ($1,k) { print $2","$3 }' dailyd.csv >> dla$i.csv
awk -v m="${i}" -F, 'match ($1,m) { print $2","$3 }' dailyu.csv >> ula$i.csv
done
当我运行那段代码时,它基本上从csv文件中提取数据并创建新文件。 那条代码完美无缺。 但是当我添加一个额外的文件(在for循环中)时,例如“180”它将创建该文件,但也会包含来自其他文件的几行数据。我多次查看代码。我甚至在进入这个循环之前检查了原始数据,这一切都是正确的。这似乎是awk中的一个小故障。 我是否需要应用等待功能才能赶上?
答案 0 :(得分:1)
也像是
for file in uls dls dlsur dailyd dailyu; do
awk -F, -vOFS=, -vfile=$i '$1 ~ /052|064|060|070|074|076|178/ {print $2,$3 >> file$1.csv}' $file.csv
done
如果它能做你想要的,那么可能会更好。通过文件调用awk和循环的次数减少了很多。 (略有不同的输出文件名。这是可以修复的,但会使脚本比我认为的目的更复杂。)
答案 1 :(得分:1)
没有。您认为发生的事情不会发生 - awk不会随意从未指定的文件中提取数据并将其放入其输出流中。
请注意,在您的第3行和后续行中,您使用的是“>>”而不是'>'对于你的输出重定向 - 你有没有考虑到这一点?
如果你更新你的问题(即不要试着在评论中做到这一点!)告诉我们你正在尝试用一些代表性的样本输入和预期的输出(只有2个输入文件,而不是5个,应该是足以解释你的问题),我们可以帮你写一个正确的脚本来做到这一点。