2014-09-18 2 views
0

Как я могу читать из нескольких переменных с помощью строки чтения while? Я пытаюсь создать файл csv из этих переменных, которые являются многострочными.Как «читать» несколько переменных в цикле while

Не уверен, что это лучший способ сделать это.

Например:

1st_list=$(..code..) 
2nd_list=$(..code..) 

while read line_from_1, line_from_2 
do 
    echo "$line_from_1,$line_from_2" >> outputfile.csv 

done < $1st_list,$2nd_list 
+0

Каковы значения образцов в '$ 1st_list' и' $ 2nd_list'? – anubhava

+0

@anubhava $ 1st_list и $ 2nd_list - это переменные скрипта, которые являются многострочными. Я пытаюсь создать файл csv с этими переменными. Не уверен, что это лучший способ сделать это. Я уточню вопрос. – hfranco

+0

У вас есть два набора строк, которые вы пытаетесь объединить, как именно? 'Line1, line2'? 'Line1field1, line2field1, l1f2, l2f2, ....? –

ответ

2

Предполагая, что вы хотите, как выход

file1line1,file2line1 
file2line2,file2line2 
etc. 

тогда вы не ничего подобного нужно вообще, как paste делает именно это.

paste -d, <(echo "$first_list") <(echo "$second_list") 
3

Ваш вопрос немного неясно, но для того, чтобы читать из нескольких источников параллельно, вам необходимо использовать несколько файловых дескрипторов и, я думаю, замена процесса.

while read line_from_1; 
     read -u 3 line_from_2; do 
    echo "From first: $line_from_1" 
    echo "From second: $line_from_2" 
done < <(echo "$first_list") 3< <(echo "$second_list") 

(Конечно, вы не должны использовать две переменные, если они не существовавшие ранее, просто поместите код, заполняющий каждую переменную в соответствующем замещении процесса, который питает while цикл:

done < <(...code for first list...) 3< <(...code for second list...) 

)

Как написано, цикл будет успешным, пока второго чтение завершается успешно (статус выхода первого чтения игнорируется). Чтобы зациклиться до тех пор, пока оба успеха, используйте read line_from_1 && read -u 3 line_from_2.

В цикле, пока либо успешно, вам потребуется несколько более сложный мини-сценарий как while условие:

while read line_from_1; read1=$?; 
     read line_from_2; read2=$?; 
     ((read1 == 0 || read2 == 0)); do 

UPDATE: вы можете просто использовать здесь строки, если переменные уже вместо замещений процесса. (Я не был уверен, что если 3<<< было законным.)

while read line_from_1; read -u 3 line_from_2; do 
    ... 
done <<< "$first_line" 3<<< "$second_line" 
+1

Это не удается, когда '$ first_list' опустошен. –

+2

Да; существует несколько способов, с которыми вы можете справиться, когда один или другой список исчерпан первым, и ОП не упомянула в вопросе, что такое желаемое поведение. – chepner

+2

Лучше, конечно, заменить «echo» $ first_list «' и 'echo» $ second_list «' кодом, который их фактически генерирует; таким образом, содержимое не нужно хранить в памяти. –

Смежные вопросы