在Unix中,在多行中转换多个列,使一列保持固定

  • 本文关键字:一列 转换 Unix unix awk transpose
  • 更新时间 :
  • 英文 :


我有一个文件在下面

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  

感谢您的帮助。

像这样一个简单的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。

如果您想动态地执行此操作,那么您可以传入所需的字段数,然后使用从第二个字段开始的循环。

在脚本中,您可以首先检查字段的数量是否等于或大于您传递到脚本中的数量(在这种情况下,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

# 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

最新更新