【问题标题】:Facing error awk: cmd. line:1: (FILENAME=rawdata.2018-01-14.csv FNR=1069) fatal: cannot open pipe `date -d (Too many open files)面对错误 awk: cmd. line:1: (FILENAME=rawdata.2018-01-14.csv FNR=1069) 致命:无法打开管道`date -d (打开的文件太多)
【发布时间】:2018-02-02 19:24:29
【问题描述】:

当我尝试将太多 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 个文件开始增加。尺寸有问题吗?

谢谢。

【问题讨论】:

  • 将您的 awk 代码添加到您的问题中。
  • 做一个ulimit -n 并在必要时增加它。
  • 大家好,我已经添加了我的代码。请建议!!
  • @cdarke,我检查了 ulimit -n,它显示为 1024。我不确定它对我的代码有何影响?或者我需要改变它吗?

标签: bash shell csv unix awk


【解决方案1】:

您在 tempdate="..."tempdate | getline 之间缺少一个分号,因此您不断地附加到 tempdate 和 idk 究竟是什么管道传送到 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"

我在做的时候还整理了一些其他的东西。

【讨论】:

  • 非常感谢@Ed Morton !!我按照您上面的建议修改了代码。有效 !您能否帮我理解为什么我们需要检查这个条件 (tempdate | getline tmpdate) > 0 以及它对我的代码有何影响?
  • 不客气。因为 getline 总是可以默默地失败,然后你会通过使用 tmpdate 的值从它最后一次成功时开始破坏你的输出,而你却不知道。您也应该添加一个“else”来打印警告。有关使用 getline 的许多注意事项,请参阅 awk.freeshell.org/AllAboutGetline
  • 非常感谢您提供有用的信息和建议!
  • 不客气 - 请参阅stackoverflow.com/help/someone-answers 了解下一步操作。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2013-01-22
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多