Добавить столбец в файл на основе последовательного ключа в третьем файле (может быть, с помощью awk?)

У меня есть текстовый файл типа:

file1.txt:

    > -L"200100"
    -6.37447846851  36.186032575
    -6.37383387763  36.1858844144
    -6.37377079559  36.1858390355
    > -L"200200"
    -6.31950329044  36.1191615625
    -6.31968900314  36.119114902
    -6.31908913286  36.1191091689
    > -L"200100"
    -6.31911178588  36.1188919898
    -6.31918479464  36.1188976987
    > -L"200250"
    -6.31909865128  36.1186432256
    -6.31920604922  36.1186522368
    -6.31941109375  36.1187126272
    ....

И второй текстовый файл вроде этого:

file2.txt

    -51
    -14
    -101
    -32
    ...

Я хочу, чтобы каждый раз, когда строка типа '> -L "200100"' (фактически любая строка, начинающаяся с '> -L') обнаруживалась в file1.txt, добавлялся третий столбец с соответствующим (последовательным) значением в file2 .текст. В моем примере результат будет следующим:

file3.txt:

    > -L"200100"
    -6.37447846851  36.186032575  -51
    -6.37383387763  36.1858844144 -51
    -6.37377079559  36.1858390355 -51
    > -L"200200"
    -6.31950329044  36.1191615625 -14
    -6.31968900314  36.119114902  -14
    -6.31908913286  36.1191091689 -14
    > -L"200100"
    -6.31911178588  36.1188919898 -101
    -6.31918479464  36.1188976987 -101
    > -L"200250"
    -6.31909865128  36.1186432256 -32
    -6.31920604922  36.1186522368 -32
    -6.31941109375  36.1187126272 -32
    ....

Количество вхождений '> -L' в file1.txt равно тому же количеству строк в file2.txt.

Возможно ли это с помощью одного лайнера awk / gawn?

Спасибо.


person rleal    schedule 13.11.2013    source источник


Ответы (2)


попробуйте этот однострочник:

awk 'NR==FNR{k[NR]=$0;next}/^>/{++i;print;next}{print $0,k[i]}' f2 f1

с вашими данными, здесь строка выше дает:

kent$  awk 'NR==FNR{k[NR]=$0;next}/^>/{++i;print;next}{print $0,k[i]}' f2 f1
> -L"200100"
-6.37447846851  36.186032575 -51
-6.37383387763  36.1858844144 -51
-6.37377079559  36.1858390355 -51
> -L"200200"
-6.31950329044  36.1191615625 -14
-6.31968900314  36.119114902 -14
-6.31908913286  36.1191091689 -14
> -L"200100"
-6.31911178588  36.1188919898 -101
-6.31918479464  36.1188976987 -101
> -L"200250"
-6.31909865128  36.1186432256 -32
-6.31920604922  36.1186522368 -32
-6.31941109375  36.1187126272 -32
person Kent    schedule 13.11.2013

Вы можете легко сделать это в Perl, если сохраните его как «Append3rdCol», а затем выполните:

chmod +x Append3rdCol
./Append3rdCol

Вот код:

#!/usr/bin/perl
use warnings;
use strict;

my $extra;
open(F1,"file1.txt") or die;
open(F2,"file2.txt") or die;
while(<F1>){
   chomp;           # Strip line ending
   if(m/^>/){               # If line starts with ">"
      print "$_\n";
      chomp($extra=readline(*F2));  # Read next line of file2 and trim <CR>
   } else {
      print "$_  $extra\n";
   }
}
person Mark Setchell    schedule 13.11.2013