Obviamente, usar um analisador csv seria melhor, mas se pudermos assumir com segurança que
- O primeiro campo nunca conterá uma vírgula;
- Você só deseja os IDs que estão presentes no primeiro arquivo (se um id estiver no arquivo2 ou no arquivo3 e não no arquivo1 de você ignorá-lo);
- Os arquivos são pequenos o suficiente para caber na sua RAM.
Então essa abordagem Perl deve funcionar:
#!/usr/bin/env perl
use strict;
my %f;
## Read the files
while (<>) {
## remove trailing newlines
chomp;
## Replace any commas within quotes with '|'.
## I am using a while loop to deal with multiple commas.
while (s/\"([^"]*?),([^"]*?)\"/"$1|$2"/){}
## match the id and the rest.
/^(.+?)(,.+)/;
## The keys of the %f hash are the ids
## each line with the same id is appended to
## the current value of the key in the hash.
$f{$1}.=$2;
}
## Print the lines
foreach my $id (keys(%f)) {
print "$id$f{$id}\n";
}
Salve o script acima como foo.pl
e execute-o assim:
perl foo.pl file1.csv file2.csv file3.csv
O script acima também pode ser escrito como um verso:
perl -lne 'while(s/\"([^"]*?),([^"]*)\"/"$1|$2"/){} /^(.+?)(,.+)/; $k{$1}.=$2;
END{print "$_$k{$_}" for keys(%k)}' file1 file2 file3