我有一个文件file1,下面有一个模式,一行用空行分隔。
First line
line1
Line2
abc
def
jkl
123456
opertxt
this is line
this is sentence
this is last line
我在下面的foramt中有另一个平面文件2。 file2中的Eact行对应于file1中的行组。
group1
group2
group3
group4
group5
我想同时读取这两个文件并重复file2中的行。我将输出重定向到file3。我想要文件3 看起来像这样。
group1
group2
group2
group3
group3
group3
group4
group4
group5
group5
group5
所以最后file1(不包括空白行)和file3中的行数相同。 有人可以使用ksh或awk建议解决方案,sed?
答案 0 :(得分:3)
您可以使用此awk
方法,首先读取数组中的file2
存储值,然后阅读file1
打印相应的行:
$ awk 'BEGIN {count=1} FNR==NR {a[++i]=$0; next} /^$/ {count++; next} {print a[count]}' f2 f1
group1
group2
group2
group3
group3
group3
group4
group4
group5
group5
group5
BEGIN {count=1}
在开头将count
var设置为1。FNR==NR {a[++i]=$0; next}
在阅读file2
时(由FNR==NR
表示),请在数组a[]
中存储每行的值。/^$/ {count++; next}
在阅读file1
时,每次找到空行时都会递增计数器。然后跳过这条线。{print a[count]}
的其余行的file1
,使用计数器指定的索引打印数组a[]
中的行存储。答案 1 :(得分:1)
Perl解决方案,并行读取两个文件:
#!/usr/bin/perl
use warnings;
use strict;
open my $LINES, '<', 'file1' or die $!;
open my $GROUPS, '<', 'file2' or die $!;
my $group = <$GROUPS>;
while (<$LINES>) {
$group = <$GROUPS>, next if /^$/;
print $group;
}
答案 2 :(得分:1)
Awk和sed:
sed 's/.*..*/0/;s/^$/1/' input | awk '$1{s += 1;next} {print "group"s+1;}'
这里有一个新组时sed输出为1,否则为0。 Awk只计算一个运行总和。
输出:
group1
group2
group2
group3
group3
group3
group4
group4
group5
group5
group5
答案 3 :(得分:1)
这是计算每个段落的行数的一种笨重方式:
awk -v RS= '
FNR==NR {split($0,groups,/\n/); next}
{n = split($0,a,/\n/); for (i=1; i<=n; i++) print groups[FNR]}
' file2 file1
答案 4 :(得分:0)
这可能适合你(GNU sed):
sed ':a;$!{N;ba};s/\n/\\n/g;s|.*|1{x;s/^/&/;x};/./!{x;s/[^\\n]*\\n//;x;d};G;s/[^\\n]*\\n//;P;d|' file2 | sed -f - file1
从组文件中构建一个针对文本文件运行的sed脚本。
该脚本将一组组附加到文本文件的每一行。然后删除文本文件行,并打印列表中的第一个组。遇到空行时,列表中的第一个组将被删除。