我有一个巨大的文本文件,其数据如下: -
东 DUBBO </跨度> - 未知东迈特兰 - 1892年东迈特兰 - 1902年东马特兰 - 1920年东马特兰 - 1937年东迈特兰 - 1940年东迈特兰 - 1956年EBOR …… - 1905年EBOR - 1911年EDEN - 未知ELLENBOROUGH - 1905年ELONG ELONG - 1920年ELONG ELONG - 1955年
我需要它采用这种格式: -
东 DUBBO </跨度> - 未知东迈特兰 - 1892年,1902年,1920年,1937年,1940年……
假设记录在公共密钥中是连续的
$ awk -F' - ' '{if(p!=$1){if(v) print v; p=$1; v=$0} else v=v ", " $2} END {print v}' file EAST DUBBO - Unknown EAST MAITLAND - 1892, 1902, 1920, 1937, 1940, 1956 EBOR - 1905, 1911 EDEN - Unknown ELLENBOROUGH - 1905 ELONG ELONG - 1920, 1955
awk -F'-' -v OFS='-' '{a[$1]=(a[$1]=="")?$2:a[$1]","$2}END{PROCINFO["sorted_in"]="@ind_str_asc";for(i in a)print i,a[i]}' file EAST DUBBO - Unknown EAST MAITLAND - 1892, 1902, 1920, 1937, 1940, 1956 EBOR - 1905, 1911 EDEN - Unknown ELLENBOROUGH - 1905 ELONG ELONG - 1920, 195
简要说明,
-F'-' -v OFS='-'
a[$1]=(a[$1]=="")?$2:a[$1]","$2
$1
$2
a[$1]
PROCINFO["sorted_in"]="@ind_str_asc"
gawk
假设输入行按排序顺序(或以其他方式分组),可以使用sed完成:
#!/bin/sed -f :loop # If we've reached the end, print it and exit # (Not required for GNU sed, whose N command continues) $q # read another line of input N # if the two lines have the same beginning, join them and repeat /^\(.*\) - .*\n\1 - /s/\n.* - /,/ tloop # otherwise, print the first line and eliminate it P s/.*\n// bloop