我有一个由许多表组成的文件,这些表包含有关某些坐标的数据。每个表格都用一行代表“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变量?)非常感谢任何帮助。
答案 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”替换第一个实例 坐标文件的第一行,第二行用的 第二行等。
让我们看看我们是否可以解决这个问题:
Coords
shift
将从坐标列表中提取第一个值)以下是可能的样子:
#!/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);