我想拆分一个看起来像这样的csv文件:
a|b|1,2,3
c|d|4,5
e|f|6,7,8
目标是这种格式:
a|b|1
a|b|2
a|b|3
c|d|4
c|d|5
e|f|6
e|f|7
e|f|8
如何在bash或awk中执行此操作?
答案 0 :(得分:1)
使用bash:
while IFS="|" read -r a b c; do for n in ${c//,/ }; do echo "$a|$b|$n"; done; done <file
输出:
a|b|1 a|b|2 a|b|3 c|d|4 c|d|5 e|f|6 e|f|7 e|f|8
答案 1 :(得分:0)
$ cat hm.awk
{
s = $0; p = ""
while (i = index(s, "|")) { # `p': up to the last '|'
# `s': the rest
p = p substr(s, 1 , i)
s = substr(s, i + 1)
}
n = split(s, a, ",")
for (i = 1; i <= n; i++)
print p a[i]
}
用法:
awk -f hm.awk file.csv
答案 2 :(得分:0)
在Gnu awk(split
)中:
$ awk '{n=split($0,a,"[|,]");for(i=3;i<=n;i++) print a[1] "|" a[2] "|" a[i]}' file
答案 3 :(得分:0)
perl
$ cat ip.csv
a|b|1,2,3
c|d|4,5
e|f|6,7,8
$ perl -F'\|' -lane 'print join "|", @F[0..1],$_ foreach split /,/,$F[2]' ip.csv
a|b|1
a|b|2
a|b|3
c|d|4
c|d|5
e|f|6
e|f|7
e|f|8
|
上的输入行拆分为@F
数组
对于通用的最后一列,
perl -F'\|' -lane 'print join "|", @F[0..$#F-1],$_ foreach split /,/,$F[-1]' ip.csv