awk/sed 比较第一列并在一行中添加后续行
awk/sed to compare first column and add in subsequent lines in one row
我在文件中有以下内容
20161109104500.0+0000,x,5631
20161109104500.0+0000,y,2
20161109104500.0+0000,z,2
20161109104500.0+0000,a,4117
20161109104500.0+0000,b,6182
20161109104500.0+0000,c,1556
618
225
41
4
20161109104500.0+0000,k,2689
20161109104500.0+0000,l,6182
20161109104500.0+0000,d,3241
20161109104500.0+0000,e,2418
20161109104500.0+0000,f,26
20161109104500.0+0000,g,285166.843750
20161109104500.0+0000,h,67216
我想做的是比较第一列 (date/time),如果匹配,则将行连接成一个。以下是所需的输出
20161109104500.0+0000,x,5631,y,2,z,2,a,4117,b,6182,c,1556
20161109104500.0+0000,k,2689,l,6182,d,3241,e,2418,f,26,g,285166.843750,h,67216
想用awk/sed来执行这个操作
也许下面的 awk
会有所帮助,它会匹配所有日期并将它们合并成一行并保留不匹配的。
awk -F',' '{if(a!=) {a=; printf "\n%s%s",[=10=],FS} else {a=;="";printf [=10=] }} END {printf "\n" }' file
20161109104500.0+0000,x,5631, y 2 z 2 a 4117 b 6182 c 1556
618,
225,
41,
4,
20161109104500.0+0000,k,2689, l 6182 d 3241 e 2418 f 26 g 285166.843750 h 67216
下面的 awk
将匹配所有日期并将它们合并为一行并删除不匹配的。
awk -F, '{if(A!= && A && VAL ~ /,/){print VAL;VAL=""};VAL=A==?VAL OFS OFS :[=11=];A=} END{print VAL}' file
20161109104500.0+0000,x,5631 y 2 z 2 a 4117 b 6182 c 1556
20161109104500.0+0000,k,2689 l 6182 d 3241 e 2418 f 26 g 285166.843750 h 67216
以上代码认为必须匹配的第一个字段是基于下一行而不是整个文件,并假设文件的非匹配行中没有 (,)。
我在文件中有以下内容
20161109104500.0+0000,x,5631
20161109104500.0+0000,y,2
20161109104500.0+0000,z,2
20161109104500.0+0000,a,4117
20161109104500.0+0000,b,6182
20161109104500.0+0000,c,1556
618
225
41
4
20161109104500.0+0000,k,2689
20161109104500.0+0000,l,6182
20161109104500.0+0000,d,3241
20161109104500.0+0000,e,2418
20161109104500.0+0000,f,26
20161109104500.0+0000,g,285166.843750
20161109104500.0+0000,h,67216
我想做的是比较第一列 (date/time),如果匹配,则将行连接成一个。以下是所需的输出
20161109104500.0+0000,x,5631,y,2,z,2,a,4117,b,6182,c,1556
20161109104500.0+0000,k,2689,l,6182,d,3241,e,2418,f,26,g,285166.843750,h,67216
想用awk/sed来执行这个操作
也许下面的 awk
会有所帮助,它会匹配所有日期并将它们合并成一行并保留不匹配的。
awk -F',' '{if(a!=) {a=; printf "\n%s%s",[=10=],FS} else {a=;="";printf [=10=] }} END {printf "\n" }' file
20161109104500.0+0000,x,5631, y 2 z 2 a 4117 b 6182 c 1556
618,
225,
41,
4,
20161109104500.0+0000,k,2689, l 6182 d 3241 e 2418 f 26 g 285166.843750 h 67216
下面的 awk
将匹配所有日期并将它们合并为一行并删除不匹配的。
awk -F, '{if(A!= && A && VAL ~ /,/){print VAL;VAL=""};VAL=A==?VAL OFS OFS :[=11=];A=} END{print VAL}' file
20161109104500.0+0000,x,5631 y 2 z 2 a 4117 b 6182 c 1556
20161109104500.0+0000,k,2689 l 6182 d 3241 e 2418 f 26 g 285166.843750 h 67216
以上代码认为必须匹配的第一个字段是基于下一行而不是整个文件,并假设文件的非匹配行中没有 (,)。