我遇到了错误,
致命:无法打开管道(打开的文件太多)
#!/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
答案 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)
有趣的内容: