ввод perl из 2 текстовых файлов для создания одного текстового файла - PullRequest
1 голос
/ 10 августа 2010

У меня есть один текстовый файл (файл A), около 200 строк, каждая строка в формате

afield1 afield2 afield3 afield4 afield5

и другой текстовый файл (файл B), около 300 строк, тот же формат

bfield1 bfield2 bfield3 bfield4 bfield5

Я хочу создать еще один текстовый файл, в котором, если afield1 и bfield1 совпадают, он записывает строку вроде:

"some text" bfield4 "some text" afield3 "some text" afield1

Я думаю, что это будет очень легко сделать в perl или даже в awk, еслиЯ просто знал как.простой сценарий оболочки оказывается очень сложным.

Очень благодарен за любую полученную помощь.

Спасибо

Ответы [ 4 ]

1 голос
/ 10 августа 2010
awk 'FNR==NR{a[$1];next}($1 in a) {print "sometext "$4" some text blah"} ' file1 file2

приведите более конкретный пример файла данных и ожидаемого результата в следующий раз.

1 голос
/ 10 августа 2010

В Bash:

join <(sort fileA) <(sort fileB) | awk '{print $8, "some text", $3, "some text", $1}'

Если вы не используете Bash, может потребоваться предварительная сортировка файлов.

sort fileA > temp1
sort fileA > temp2
join temp1 temp2 | awk '{print $8, "some text", $3, "some text", $1}'
1 голос
/ 10 августа 2010

Ну, это может быть даже проще с некоторыми модулями, но, поскольку вам, кажется, нужно что-то быстрое и грязное, вот что я могу придумать. (это предполагает, что ваш файл разделен запятыми. Измените разделитель в вызове split, если вы используете что-то другое.

open(my $fh1, "fileA.txt") or die $!;
open(my $fh2, "fileB.txt") or die $!;
open( my $out, ">outfile.txt") or die $!;
while( my $line = <$fh2> ) {
     chomp($line);
     my @columns_2 = split(/,/, $line);
     my $a_line = <$fh1>;
     my @columns_1 = split(/,/, $a_line);

     if( $columns_2[0] eq $columns_1[0] ) {
          print $out "text $columns_2[3] more text $columns_1[2] more text $columns_1[0]\n";
     }
}
close($fh1);
close($fh2);
close($out);
0 голосов
/ 10 августа 2010

Опираясь на ответ ghostdog74

awk '
    # read file1 first
    FNR == NR {
        # store afield3 for later
        a[$1] = $3 
        next
    }
    ($1 in a) {
        # bfield1 == some afield1
        print "some text " $4 " some text " a[$1] " some text " $1
    } 
' file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...