2016-10-02 41 views
0

我有一個這樣的文件:如何將逗號分隔的字段變成不同的行?

A 10,30,50,70 20,40,60,80 + 

我怎樣才能使這個成爲:

A 10 20 + 
A 30 40 + 
A 50 60 + 
A 70 80 + 

我用這個awk命令試過,但沒有奏效。

awk '{ split($2,a,","); for (i in a) print $1, a[i]; }' 
+0

請問您的文件真的只有在它1號線?如果這樣的話,如果沒有在您的示例輸入/輸出中顯示更多信息。輸出行的順序是否必須與輸入字段的順序相匹配。 –

回答

2

創建另一個分裂-ED陣列b,在這裏保持在第3列的元素:

echo "A 10,30,50,70 20,40,60,80 +" | awk '{ split($2,a,","); split($3,b,","); for (i in a) print $1, a[i], b[i], $4; }' 
2
awk '{ split ($2, a,","); split ($3,b,","); for (i in a) print $1, a[i], b[i], $NF; }' 

應該給你的結果。

1

這可能是你要找的東西:

$ awk -F'[ ,]' '{for (i=2;i<6;i++) print $1, $i, $(i+4), $NF}' file 
A 10 20 + 
A 30 40 + 
A 50 60 + 
A 70 80 + 

,或者如果你不想硬編碼字段數:

$ awk -F'[ ,]' '{n=NF/2; for (i=2;i<=n;i++) print $1, $i, $(i+n-1), $NF}' file 
A 10 20 + 
A 30 40 + 
A 50 60 + 
A 70 80 + 
0
$ cat ip.txt 
A 10,30,50,70,90 20,40,60,80,00 + 
B ab,56,is,jw,23 09,we,io,21,aw + 

通用的解決方案,與第二列和第三列中的逗號分隔數量無關...

$ perl -lane '@a = split/,/,$F[1]; @b = split/,/,$F[2]; foreach (0..$#a){ print "$F[0] $a[$_] $b[$_] $F[3]" }' ip.txt 
A 10 20 + 
A 30 40 + 
A 50 60 + 
A 70 80 + 
A 90 00 + 
B ab 09 + 
B 56 we + 
B is io + 
B jw 21 + 
B 23 aw + 


而類似Ed Morton's answer

$ perl -F'/\s|,/' -lane 'foreach (1..5){ print "$F[0] $F[$_] $F[$_+5] $F[-1]" }' ip.txt 
A 10 20 + 
A 30 40 + 
A 50 60 + 
A 70 80 + 
A 90 00 + 
B ab 09 + 
B 56 we + 
B is io + 
B jw 21 + 
B 23 aw + 

其中foreach (1..5)$F[$_+5]表示第二和第三列5逗號分隔值的解決方案

相關問題