Bash 在新行中放置列,同时添加前几行中的信息

Bash 在新行中放置列,同时添加前几行中的信息,bash,awk,Bash,Awk,我想将文件中的列数减少到3,方法是将第3列以外的所有列放到新行中,并在这些字符串前面加上前一行中的第1列和第2列值。这有点抽象,因此下面是一个示例: Column1 Column2 Column3 A1 B1 C1 A2 B2 C2 D2 A3 B3 C3 D3 E3 A4 B4 C4 变成 Column1 Column2 Column3 A1 B1 C1 A2 B2 C2 A2 B2 D2 A3 B3 C3 A3 B3 D3 A3 B3 E3 A4 B4 C4 每个Cn、Dn和En值都需要

我想将文件中的列数减少到3,方法是将第3列以外的所有列放到新行中,并在这些字符串前面加上前一行中的第1列和第2列值。这有点抽象,因此下面是一个示例:

Column1 Column2 Column3
A1 B1 C1
A2 B2 C2 D2
A3 B3 C3 D3 E3
A4 B4 C4
变成

Column1 Column2 Column3
A1 B1 C1
A2 B2 C2
A2 B2 D2
A3 B3 C3
A3 B3 D3
A3 B3 E3
A4 B4 C4
每个
Cn
Dn
En
值都需要
An
Bn
的信息

我在这里找到了问题第一部分的解决方案:

这就产生了

Column1 Column2 Column3
A1 B1 C1


A2 B2 C2
D2

A3 B3 C3
D3
E3
A4 B4 C4
因此,移动的字符串缺少
An
Bn
。不幸的是,也会生成一堆空的新行,它们可以在额外的步骤中删除,也可以在相同的过程中删除,我不在乎这一点。

使用循环:

$ awk '{for(i=3;i<=NF;i++) print $1, $2, $i}' ip.txt
Column1 Column2 Column3
A1 B1 C1
A2 B2 C2
A2 B2 D2
A3 B3 C3
A3 B3 D3
A3 B3 E3
A4 B4 C4
$awk'{for(i=3;i使用循环:

$ awk '{for(i=3;i<=NF;i++) print $1, $2, $i}' ip.txt
Column1 Column2 Column3
A1 B1 C1
A2 B2 C2
A2 B2 D2
A3 B3 C3
A3 B3 D3
A3 B3 E3
A4 B4 C4

$awk'{for(i=3;i一个不使用循环的版本,但如果列数增加,则不灵活

awk '{s=$1FS$2;print s,$3 ($4?"\n"s FS$4:"") ($5?"\n"s FS$5:"")}' file
Column1 Column2 Column3
A1 B1 C1
A2 B2 C2
A2 B2 D2
A3 B3 C3
A3 B3 D3
A3 B3 E3
A4 B4 C4

不使用循环的版本,但在列数增加时不灵活

awk '{s=$1FS$2;print s,$3 ($4?"\n"s FS$4:"") ($5?"\n"s FS$5:"")}' file
Column1 Column2 Column3
A1 B1 C1
A2 B2 C2
A2 B2 D2
A3 B3 C3
A3 B3 D3
A3 B3 E3
A4 B4 C4