У меня есть два файла:
a.csv
12,34,56
11,23,67
b.csv
12,34,98
11,23,43
Я хочу объединить их в final.csv:
12,34,56,98
11,23,67,43
и размер файла составляет 10 ГБ
Я использовал csvtool
но это не работает, когда размер файла является слишком большим
Те же результаты могут также быть получены с командами удара.
paste a.csv b.csv |awk -F",||\t" '{print $1","$2","$3","$6}'
код дает следующий вывод:
12,34,56,98
11,23,67,43
Сценарий жемчуга ниже читает эти два файла одновременно и присоединяется к каждой строке из файла a.csv
продлиться объект в b.csv
.Files даны как аргументы на командной строке. Порядок файлов важен.
#!/usr/bin/env perl
use strict;
use warnings;
open(my $fh1,'<',$ARGV[0]) or die $!;
open(my $fh2,'<',$ARGV[1]) or die $!;
while( not eof($fh1) and not eof($fh2)){
my $line1 = <$fh1>;
my $line2 = <$fh2>;
chomp $line1;
chomp $line2;
my @words2 = split(",",$line2);
printf("%s,%s\n",$line1,$words2[-1]);
}
Тестовый прогон:
$ cat a.txt
12,34,56
11,23,67
$ cat b.txt
12,34,98
11,23,43
$ ./merge_files.pl a.txt b.txt
12,34,56,98
11,23,67,43
Для отправки данных в новый файл используют оператор перенаправления оболочки >
как так:
./merge_files.pl a.txt b.txt > final.txt