在Unix中将多列转置为多行并保持一列不变

lstz6jyr  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(165)

我有一个文件,如下所示

1234|A|B|C|10|11|12  
2345|F|G|H|13|14|15  
3456|K|L|M|16|17|18

我希望输出为

1234|A  
1234|B  
1234|C  
2345|F  
2345|G  
2345|H  
3456|K  
3456|L  
3456|M

我已经尝试了下面的脚本。

awk -F"|" '{print $1","$2","$3","$4"}' file.dat | awk -F"," '{OFS=RS;$1=$1}1'

但生成的输出如下所示。

1234  
A  
B  
C  
2345  
F  
G  
H  
3456  
K  
L  
M

任何帮助都是感激不尽的。

ac1kyiln

ac1kyiln1#

下面这样一个简单的awk过程怎么样:

$ awk -F\| '{print $1 "|" $2 "\n" $1 "|" $3 "\n" $1 "|" $4}' file.dat
1234|A
1234|B
1234|C
2345|F
2345|G
2345|H
3456|K
3456|L
3456|M

请勿干扰RS和OFS。

0yg35tkg

0yg35tkg2#

如果要动态执行此操作,则可以传入所需的字段数,然后从第二个字段开始使用循环。
在脚本中,您可以首先检查字段的数量是否等于或大于传递给脚本的数量(在本例中n=4)

awk -F\| -v n=4 '
NF >= n {
  for(i=2; i<=n; i++) print $1 "|" $i
}
' file

输出量

1234|A
1234|B
1234|C
2345|F
2345|G
2345|H
3456|K
3456|L
3456|M
mqkwyuun

mqkwyuun3#

# perl -lne'($a,@b)=((split/\|/)[0..3]);foreach (@b){print join"|",$a,$_}' file.dat

1234|A
1234|B
1234|C
2345|F
2345|G
2345|H
3456|K
3456|L
3456|M

相关问题