2013-02-27 2 views
0

Я хочу что-то сделать с текстом из двух файлов одновременно.bash script - почему он не открывает первый файл?

fname3=XX1.txt fname2=XX2.txt 


while read -r -u3 line1; read -r -u4 line2; do 
    echo "$line1:$line2"; 
done 3< "$fname3" 4< "$fname2" 

Выход показывает всегда ": (текст)", я ожидаю его выхода "(текст) :(текст)". Файлы большие, это имеет значение?

+0

Работы для меня ... –

+0

я продублировал Баш скрипт в другой файл. Первый файл работает, но второй файл не работает, происходит ли копирование скрипта? Файлы действительно большие ... – wagashi

+0

Вы ищете 'paste -d: XX1.txt XX2.txt'? – tripleee

ответ

3

Это прекрасно работает как отправлено для любого размера файла. Вот полный, автономный скрипт, который демки его для миллиона строк файлов:

#!/bin/bash 
printf "foo%s\n" {1..1000000} > XX1.txt 
printf "bar%s\n" {1..1000000} > XX2.txt 

fname3=XX1.txt fname2=XX2.txt 

while read -r -u3 line1; read -r -u4 line2; do 
    echo "$line1:$line2"; 
done 3< "$fname3" 4< "$fname2" 

Выход:

foo1:bar1 
foo2:bar2 
... 
foo999999:bar999999 
foo1000000:bar1000000 

Если первый файл короче, чем второй, последние оставшиеся линии будут :line, пока второй файл не будет полностью прочитан. Если второй файл короче, скрипт остановится, когда это будет сделано, и проигнорируйте остальную часть первого файла.

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

+0

, пожалуйста, прочитайте мои комментарии по моему вопросу. – wagashi

+0

Я сделал и обновил пример, чтобы развенчать вашу теорию о больших файлах. Возможно, вы хотели бы предоставить свой собственный тестовый пример, демонстрирующий проблему? –

+0

Ах, это было 10 строк меньше в первом файле, чем второй файл. Однако я все равно получаю такой же результат. Я также получаю ошибку между выводами, в которой говорится: «Ошибка: рядом с« s »: синтаксическая ошибка« Это ошибка sqlite, но что означает эта ошибка? – wagashi

0

Если все, что вы хотите сделать, это сцепить соответствующие строки, используйте paste:

paste -d : $fname3" "$fname2" 
+0

, пожалуйста, прочитайте мои комментарии по моему вопросу. Это не конкатенирование, которое я хочу, и кроме того, я не могу читать строки за строкой из двух файлов одновременно. – wagashi

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