当我尝试将多个csv文件连接在一起时,我面临如下错误。
面临错误
等等......直到FNR = 1074awk: cmd. line:1: (FILENAME=rawdata.2018-01-14.csv.bkp FNR=1069) fatal: cannot open pipe `date "+%F %T" -d "Jan 13 22:00:12 2018"1' (Too many open files) awk: cmd. line:1: (FILENAME=rawdata.2018-01-15.csv.bkp FNR=1070) fatal: cannot open pipe `date "+%F %T" -d "Jan 13 22:00:12 2018"1' (Too many open files)
在60个文件中,处理前44个文件和接下来的16个文件在连接时出错。
代码:
for i in rawdata.*.csv;
do
echo $i;
awk '{if($0) printf("%s\t%s\n", FILENAME, $0); else print FILENAME;}' $i > $i.bk;
sed -e "1,2d" $i.bk > $i.bkp
awk -e '{tempdate="date \"+%F %T\" -d \""$6" "$7" "$8" "$9"\"" tempdate | getline tmpdate; print tmpdate "\t" "source-" $1 "\t" $2 "\t" $3 "\t" $4 "\t" $9 "\t" $10 "\t" $11 ; close(tempdate) }' $i.bkp | sed 's/.//5' > $i.bakp
done
cat rawdata.*.bakp > rawdatacombnew.csv
rm rawdata.*.bk
rm rawdata.*.bkp
rm rawdata.*.bakp
任何建议都会非常有用。
我看到的一个观察是,在我的示例中处理第45个文件的文件大小增加了。尺寸是个问题吗?感谢。
答案 0 :(得分:1)
你错过了tempdate="..."
和tempdate | getline
之间的分号,所以你不断追加到tempdate并且忘记了什么正在通过管道进入getline!
将脚本填充到单行上没有任何好处,只需自然地编写它,它就会更容易阅读并发现问题:
awk -v OFS='\t' '{
tempdate="date \"+%F %T\" -d \""$6" "$7" "$8" "$9"\""
if ( (tempdate | getline tmpdate) > 0 ) {
print tmpdate, "source-" $1, $2, $3, $4, $9, $10, $11
}
close(tempdate)
}' "$i.bkp"
当我在场的时候,我整理了其他几件事。