将匹配替换为其他文件中的值

时间:2013-06-25 17:25:09

标签: perl bash sed awk

我有一个由许多表组成的文件,这些表包含有关某些坐标的数据。每个表格都用一行代表“Coords”。

Coords
Table 1
Coords 
Table 2
Coords
Table 3
...

在一个单独的文件中,我有一个与表匹配的所有坐标的列表。

Coordinate 1
Coordinate 2
Coordinate 3
...

我要做的是用坐标文件的第一行替换第一个“Coords”实例,用第二行替换第二个实例等。

Coordinate 1
Table 1
Coordinate 2
Table 2
Coordinate 3
Table 3
...

我试过这个:

while read coord
do
    perl -pln -e 's/Coords/$coord/' Tables >> Output
done <Coordinates

但它没有用。 (因为perl不能使用bash变量?)非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

这是一个带有awk的简单单行:

awk '/Coords/{getline<"coords.txt"}1' template.txt

将坐标文件读入内存的一个稍微不那么有趣的事情:

awk 'NR==FNR{repl[NR]=$0;next}/Coords/{$0=repl[++n]}1' coords.txt template.txt

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -e '/Coords/{Rcoord.txt' -e 'd}' template.txt

答案 2 :(得分:0)

你可以很容易地做到这一点,你只需要将其分解为可管理的步骤。

  

我要做的是用“Coords”替换第一个实例   坐标文件的第一行,第二行用的   第二行等。

让我们看看我们是否可以解决这个问题:

  1. 从坐标文件中读取数据(可能是列表)
  2. 逐行浏览占位符文件,搜索Coords
  3. 如果找到匹配项,请使用坐标文件中的下一行覆盖该行(使用shift将从坐标列表中提取第一个值)
  4. 以下是可能的样子:

    #!/usr/bin/perl
    use strict;
    use warnings FATAL => 'all';
    
    # open the coordinates file for reading
    open(my $coord_fh, '<', 'coordinates.txt');
    
    # read the file (line by line) into a List
    my @coordinates = <$coord_fh>;
    
    # close coordinate filehandle
    close($coord_fh);
    
    # open the other file for reading
    open(my $other_fh, '<', 'otherfile.txt');
    
    # save the lines you process
    my @lines;
    
    # first coordinate
    my $coord = shift @coordinates;
    
    # read line by line seraching for Coord
    # replace with shift @coordinates if found
    while ( my $line = <$other_fh> ) {
        if( $line =~ s/Coords/$coord/ ) {
            # get next coordinate
            $coord = shift @coordinates;
        }
    
        # save line
        push @lines, $line;
    }
    
    # close file for reading
    close($other_fh);
    
    
    # write all of the lines back to your file
    open(my $out_fh, '>', 'otherfile.txt');
    
    print {$out_fh} "$_" foreach(@lines);