重新排列文件内容以将记录“标题”行添加到每个记录“正文”行

重新排列文件内容以将记录“标题”行添加到每个记录“正文”行

任何人都知道如何扭转这个:

FX_AM140_EML AM140
Backend/aa.java
Backend/bb.java
Backend/cc.java
Backend/dd.java
Backend/ee.java

FX_AM172_EML AM172
Backend/aa.java
Backend/bb.java

到这个?

FX_AM140_EML AM140 Backend/aa.java
FX_AM140_EML AM140 Backend/bb.java
FX_AM140_EML AM140 Backend/cc.java
FX_AM140_EML AM140 Backend/dd.java
FX_AM140_EML AM140 Backend/ee.java
FX_AM172_EML AM172 Backend/aa.java
FX_AM172_EML AM172 Backend/bb.java

答案1

像 with 这样的东西awk可以完成这项工作:

awk '/^FX/ {a=$0;next} /^Backend/ {print a,$0}' <input file>

这里我假设标题行开头为FX,其他行开头为Backend

答案2

另一种awk方法将由空行分隔的一组行中的第一行视为前缀:

awk '
  $0 == ""     {prefix = ""; next}
  prefix == "" {prefix = $0; next}
               {print prefix, $0}'

答案3

Perl 的建议。此变体的驱动程序是多组行由空行分隔:

perl -ne '
    BEGIN {$/ = "\n\n"}
    ($p, @a) = split("\n");
    print "$p $_\n" foreach @a;
' datafile

它作为多行更具可读性,但它可以被压缩为一行(我已经交换了子句BEGINfor -00,这也切换了段落模式):

perl -00 -ne '($p, @a)=split("\n"); print "$p $_\n" foreach @a' datafile

等价awk的是这样的(也可以通过简单的串联将其压缩为一行):

awk -v RS= '
    {
        split($0, a, "\n");
        p=a[1]; delete a[1];
        for (f in a) {
            print p, a[f]
        }
    }
' datafile

将记录分隔符 ( RS) 设置为空字符串会打开段落模式 (POSIX,然后搜索“如果 RS 为空”)

输出

FX_AM140_EML AM140 Backend/aa.java
FX_AM140_EML AM140 Backend/bb.java
FX_AM140_EML AM140 Backend/cc.java
FX_AM140_EML AM140 Backend/dd.java
FX_AM140_EML AM140 Backend/ee.java
FX_AM172_EML AM172 Backend/aa.java
FX_AM172_EML AM172 Backend/bb.java

答案4

Perl 方法使用任何不包含的行/作为其他行的前缀:

$ perl -lne 'if(/^(.[^\/]+)$/ || /^$/){ $k=$1; next} print "$k $_"' file
FX_AM140_EML AM140 Backend/aa.java
FX_AM140_EML AM140 Backend/bb.java
FX_AM140_EML AM140 Backend/cc.java
FX_AM140_EML AM140 Backend/dd.java
FX_AM140_EML AM140 Backend/ee.java
FX_AM172_EML AM172 Backend/aa.java
FX_AM172_EML AM172 Backend/bb.java

相关内容