任何人都知道如何扭转这个:
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
它作为多行更具可读性,但它可以被压缩为一行(我已经交换了子句BEGIN
for -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