繁体   English   中英

使用awk根据另一文件中的一组行复制上一行

[英]copy the previous line based on a group of line in another file using awk

我在下面的模式中有一个与文件contect相连的文件,该行组由空行分隔。

First line

line1 
Line2

abc
def
jkl

123456
opertxt

this is line
this is sentence
this is last line

我在下面的孔中有另一个平面file2。 file2中的有效行对应于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解决方案吗?

您可以使用这种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} FNR==NR {a[++i]=$0; next}当读file2 (由指示FNR==NR ),存储阵列中的a[]每行的值。
  • /^$/ {count++; next} /^$/ {count++; next}阅读时file1 ,每一个空行被发现时增加计数器。 然后跳过这一行。
  • {print a[count]}file1的其余行上,用计数器指定的索引打印存储在数组a[]的行。

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;
}

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

这是一种计算每段行数的笨拙方法:

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

这可能对您有用(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脚本,该脚本针对文本文件运行。

该脚本将组列表附加到文本文件的每一行。 然后删除文本文件行,并打印列表中的第一组。 遇到空行时,列表上的第一组将被删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM