Чтение нескольких файлов одна строка за один раз в ударе

Мне удалось сделать это на FreeBSD и Вине 1.5.24 путем установки LC_ALL и LANG кому: ru_RU.UTF-8. Обратите внимание, что это ru_RU.UTF-8 и нет ru_RU.utf8, с более поздним существом недопустимое имя локали в моей системе, по крайней мере. Я предполагаю, что это может быть проблемой на другом *, ОТКЛОНЯЮТ системы, и в Вашем конкретном случае, также.

HTH

5
16.01.2018, 21:53
3 ответа

паста был бы тому подобным образом сделать это. Но с дескрипторами Bash файла и замены процесса:

exec 3< <(cal 1 2015)
exec 4< <(cal 2 2015)
exec 5< <(cal 3 2015)

while IFS= read -r -u3 line1; do
    IFS= read -r -u4 line2
    IFS= read -r -u5 line3
    printf "%-25s%-25s%-25s\n" "$line1" "$line2" "$line3"
done

exec 3<&-
exec 4<&-
exec 5<&-
    January 2015             February 2015             March 2015          
Su Mo Tu We Th Fr Sa     Su Mo Tu We Th Fr Sa     Su Mo Tu We Th Fr Sa     
             1  2  3      1  2  3  4  5  6  7      1  2  3  4  5  6  7     
 4  5  6  7  8  9 10      8  9 10 11 12 13 14      8  9 10 11 12 13 14     
11 12 13 14 15 16 17     15 16 17 18 19 20 21     15 16 17 18 19 20 21     
18 19 20 21 22 23 24     22 23 24 25 26 27 28     22 23 24 25 26 27 28     
25 26 27 28 29 30 31                              29 30 31                 
7
27.01.2020, 20:35

Вы могли бы использовать в пасте для объединения вывода, а затем чтение в строках:

paste -d $'\n' <(foo) <(bar) <(cat baz) | while IFS= read -r line1
do
    IFS= read -r line2 || break
    IFS= read -r line3 || break
    # ..
done
2
27.01.2020, 20:35

Это такая структура что тебе понадобится.

Вы были на правых линиях с вашим ФИФО, но причина CAL , если вы читаете одну строку из этого, заключается в том, что линия чтения открыла FIFO, прочитать линия, а затем снова закрыла. Закрытие трубы отправляет сигнал на другую сторону, указывающую, что не может быть сделано больше пишений (чтение). Итак Cal .

# Create the FIFOs
mknod pipe1 p
mknod pipe2 p
mknod pipe3 p

# Start off the commands
command1 >pipe1 &
command2 >pipe2 &
command3 >pipe3 &

# Attach file descriptors to the other side of the FIFOs
exec 11<pipe1 12<pipe2 13<pipe3

# Loop
IS_MORE=0
while [[ 0 eq $IS_MORE ]]
do
    IS_MORE=1
    read LINE1 <&11 && IS_MORE=0
    read LINE2 <&12 && IS_MORE=0
    read LINE3 <&13 && IS_MORE=0
    # ...
done

# Close descriptors and remove the FIFOs
exec 11<&- 12<&- 13<&-
rm -f pipe1 pipe2 pipe3

# Clean up the dead processes (zombies)
wait

# ...
0
27.01.2020, 20:35

Теги

Похожие вопросы