1

我有一个类型的文本文件:

文件 1.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
    ....

还有一个像这样的第二个文本文件:

文件2.txt

    -51
    -14
    -101
    -32
    ...

我希望每次在 file1.txt 上找到类型为 '> -L"200100"' 的行(实际上是任何以 '> -L' 开头的行)时,都会附加第三列,并采用 file2 中的相应(顺序)值。文本。在我的示例中,输出将是:

文件 3.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 有可能吗?

谢谢。

4

2 回答 2

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
于 2013-11-13T12:26:03.213 回答
1

如果您将其保存为“Append3rdCol”,那么您可以在 Perl 中轻松完成,然后执行以下操作:

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";
   }
}
于 2013-11-13T12:20:28.073 回答