LINUX.ORG.RU
ФорумAdmin

script: объединить два файла


0

0

надо слить/объединить два файла, кол-во строк одинаковое
$ cat file1
line1
line2
line3
line4
line5

$cat file2
aaa
bbb
ccc
ddd
eee

надо получить такое:

line1 aaa
line2 bbb
line3 ccc
line4 ddd
line5 eee

файлы могут быть большими, поэтому читать их в массивы и потом в цикле
делать
echo "$arr1[$i] $arr2[$i]" >>result
нежелательно

anonymous

Ответ на: комментарий от watashiwa_daredeska

Неэффективно.

$wc -l file[12]
 100000 file1
 100000 file2

$cat files.sh
#! /bin/sh

mix() {
        while read FILE1 <&3 && read FILE2 <&4; do
                echo "$FILE1 $FILE2"
        done 3<$1 4<$2
}
mix ./file1 ./file2

$ time ./files.sh >/dev/null
real    0m37.361s
user    0m32.840s
sys     0m4.520s
#-----------------------------------------------
Пока сделал так, но уверен есть лучшее решение
$cat files2.sh
#! /bin/sh
file1='./file1'
file2='./file2'

cat -n $file1 > $file1.tmp
cat -n $file2 > $file2.tmp
join $file1.tmp $file2.tmp | cut -d' ' -f2-
rm $file1.tmp $file2.tmp

$time ./files2.sh >/dev/null

real    0m2.640s
user    0m2.500s
sys     0m0.130s

anonymous
()
Ответ на: комментарий от anonymous

> Неэффективно

Зато переносимо :)

> Пока сделал так

Ну, так я тоже могу. Даже ещё короче:

$ join <(nl file1) <(nl file2) |cut -d\ -f2-

И никаких временных файлов. Но:

1. это работает далеко не на всех шеллах (я знаю только bash, может ещё zsh - не пробовал), хотя непереносимость лечится явным созданием fifo.

2. портит пробелы в строках. Можно поиграть со всякими join -t$'\001', nl -s$'\001' и пр.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Наверное так будет лучше всего и быстро и максимально переносимо (надеюсь команда getline в awk стандартная для всех версий awk)


$ time awk '{a=$0 ; getline b<"./file2" ; print a,b}' <./file1 >/dev/null

real    0m1.070s
user    0m1.060s
sys     0m0.010s

$wc -l file[12]
 100000 file1
 100000 file2

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.