2013-11-13 2 views
1

У меня есть текстовый файл типа (возможно, с 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“» (на самом деле любая строка ЗАПУСК ng by '> -L') находится в файле file1.txt добавляется третий столбец с соответствующим (последовательным) значением в файле2.txt. В моем примере, выходной сигнал будет:

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 oneliner?

Спасибо.

ответ

1

Вы можете сделать это довольно легко в 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"; 
    } 
} 
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 

 Смежные вопросы

  • Нет связанных вопросов^_^