面对错误awk:cmd。 line:1:(FILENAME = rawdata.2018-01-14.csv FNR = 1069)致命:无法打开管道`date -d(太多打开的文件)

时间:2018-02-02 19:24:29

标签: bash shell csv unix awk

当我尝试将多个csv文件连接在一起时,我面临如下错误。

面临错误

  awk: 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)
等等......直到FNR = 1074

在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个文件的文件大小增加了。尺寸是个问题吗?

感谢。

1 个答案:

答案 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"

当我在场的时候,我整理了其他几件事。