无法打开管道太多打开的文件

时间:2019-02-12 14:43:06

标签: awk

我遇到了错误,

致命:无法打开管道(打开的文件太多)

#!/bin/bash
output="Out.txt"
trans="DEBIT_TRANSACTION_"
ls *.txt | while read line
do
 subName="$(cut -d'.' -f1 <<<"$line")"

awk -F"|" -v var="10|" 'NF!=15;  NF==15 && /^[^[:space:]]/{ "echo -n "$6" | tail -c 3" | getline terminalCountry;
    if($6 =="") terminalCountry="IND";
  $1=var$1;$6=$6"|"terminalCountry; print $0;
}' OFS="|" "$line" > /home/lradmin/script/cboiCC/cboicTxnScrip/OUTPUT/"$subName$output"

done

2 个答案:

答案 0 :(得分:2)

如果这样:

"echo -n "$6" | tail -c 3" | getline terminalCountry

要做的事很合理,则语法如下:

cmd = "echo -n \047" $6 "\047 | tail -c 3"
terminalCountry = ( (cmd | getline line) > 0 ? line : "IND" )
close(cmd)

但这不是合理的事情。有关使用getline所需了解的一切,请参见http://awk.freeshell.org/AllAboutGetline

在这种情况下,您似乎只是想从$6中获取最后3个字符,那就是:

terminalCountry = substr($6,length($6)-3)

答案 1 :(得分:2)

您遇到的问题是您没有关闭通过管道传输到getline的命令。您写道:

"echo -n "$6" | tail -c 3" | getline terminalCountry

Awk为此进行以下操作:

如果在执行awk程序期间多次将相同的文件名或相同的shell命令与getline一起使用,则仅第一次打开文件(或执行命令)。那时,从该文件或命令中读取输入的第一条记录。下次将同一文件或命令与getline一起使用时,将从中读取另一个记录,依此类推。

这意味着,如果您有多个相同的$6,则您的命令将仅在第一次正确运行。此外,它将打开一个“文件”,命令也会在该文件中写入其输出。如果您有很多记录,它将连续打开文件,并且永远不会关闭文件,从而导致错误。

对于正确的工作顺序,您应该再次关闭“文件”。也就是说,您应该写:

command="echo -n \047" $6 "\047 | tail -c 3"
command | getline terminalCountry
close(command)

但是在这里感觉有点过头了,您可能只是对此感兴趣:

terminalCountry=substr($6,length($6)-3)

有趣的内容: