我有一个由以下形式的字符串组成的文件:
21-11-2000
1
2
3
4
5
22-11-2000
1
2
3
4
5
我希望将其转换为:
21-11-2000,1,2,3,4,5
22-11-2000,1,2,3,4,5
因此我会使用sed两次。首先用匹配[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]
的每一行用逗号替换行尾,然后用另一个sed扫描替换从行开头到逗号不匹配相同模式的每一行。
会有更简单的方法吗?
答案 0 :(得分:2)
使用awk:
awk '{
if ($1 ~ "^[0-9]+-[0-9]+-[0-9]+") {
k=$1
next
}
arr[k]=arr[k]","$1
}
END{for (a in arr) print a arr[a]}
' file
答案 1 :(得分:2)
以下是一些awk
变体:
awk -F- '{printf (NF>2?RS:",")"%s",$0}' t
21-11-2000,1,2,3,4,5
22-11-2000,1,2,3,4,5
如果每条记录总是6行,那么这是最好的:
awk 'NR%6{printf "%s,",$0;next}1' t
21-11-2000,1,2,3,4,5
22-11-2000,1,2,3,4,5
答案 2 :(得分:2)
这可能适合你(GNU sed):
sed '/-/{:a;$!N;/\n[0-9]$/s/\n/,/;ta};P;D' file
答案 3 :(得分:1)
您可以使用哪些工具?如果您的输入文件与您所描述的完全一致,则以下单行将起作用。
cat input | awk 1 ORS=',' | perl -pi -e 's/(\d),(\d+-|$)/$1\n$2/g'
答案 4 :(得分:0)
使用sed(不仅仅是数字行)
sed '/-/{:a;N;/\n[^-]*$/s/\n/,/;ta};P;D' file