не может открыть трубу слишком много открытых файлов - PullRequest
0 голосов
/ 12 февраля 2019

Я получаю сообщение об ошибке,

неустранимо: невозможно открыть канал (слишком много открытых файлов)

#!/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 голосов
/ 12 февраля 2019

Проблема, с которой вы столкнулись, заключается в том, что вы не закрываете команду, которую вы передаете на свой getline.Вы пишете:

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

Awk делает следующее с этим:

Если одно и то же имя файла или одна и та же команда оболочки используются с getline более одного раза во время выполнения программы awk,файл открывается (или команда выполняется) только в первый раз.В это время первая запись ввода читается из этого файла или команды.В следующий раз, когда тот же файл или команда будет использоваться с getline, из него будет считана другая запись и т. Д.

Это означает, что если у вас есть различные $6, которые идентичны, ваша команда будет работать толькоправильно с первого раза.Кроме того, он откроет «файл», в который команда также записывает свой вывод.Если у вас много много записей, он будет постоянно открывать файлы и никогда не закроет их, что приведет к ошибке.

Для правильного рабочего порядка вы должны снова закрыть «файл».То есть вы должны написать:

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

Но здесь это выглядит как излишнее убийство, вас может заинтересовать:

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

Интересные чтения:

0 голосов
/ 12 февраля 2019

Если бы это:

"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)

, но это не разумно.Смотрите http://awk.freeshell.org/AllAboutGetline для всего, что вам нужно знать об использовании getline.

В этом случае вы, похоже, просто пытаетесь получить последние 3 символа из $6, и это будет просто:

terminalCountry = substr($6,length($6)-3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...