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

我想通过将第3列以外的所有列都放在新行中,并在这些字符串之前加上上一行中的#1和#2值,将文件中的列数减少到3。这有点抽象,所以这里是一个示例:

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

每个CnDnEn值都需要AnBn的信息。

我在这里找到了问题的第一部分的解决方案: https://www.unix.com/shell-programming-and-scripting/125202-awk-new-line-between-columns.html

awk '{print $1,$2,$3"\n"$4"\n"$5}' oldfile > newfile

这产生

Column1 Column2 Column3
A1 B1 C1


A2 B2 C2
D2

A3 B3 C3
D3
E3
A4 B4 C4

因此,已移动的字符串缺少AnBn。不幸的是,还会生成一堆空的新行,它们可以省去一些额外的步骤,也可以在相同的过程中删除,我不在乎。

ajaxmoon 回答:在新行中添加列,同时添加前几行的信息

使用循环:

$ 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
  • for(i=3;i<=NF;i++)变量i3开始并循环直到NF(字段数)
  • print $1,$i总是先打印第一和第二字段,然后再打印基于变量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
本文链接:https://www.f2er.com/3145828.html

大家都在问