Aqui está uma maneira de fazer isso:
sed '/,/!{ # if there's no comma on this line
y/ /,/ # translate spaces to commas
h # copy pattern space over the hold buffer
d # delete pattern space
}
//{ # if the line contains commas
G # append hold space content to pattern space
s/\(.*\)\n,[^,]*,\(.*\)/,/ # swap lines removing newline, the day part and
} # first two commas and adding a comma after year
' infile
Se preferir um gnu sed
one-liner:
sed -E '/,/!{y/ /,/;h;d};//{G;s/(.*)\n,[^,]*,(.*)/,/}' infile
É semelhante com awk
:
Se a linha não contiver vírgulas, você pode formatar a data via sprintf
, salvar o resultado em uma variável, por exemplo, dt
e depois vá para next
record. Senão prefixar dt
a $0
(essa é a linha atual):
awk '!/,/{dt=sprintf("%s,%s,%s,", $2, $3, $4);next};$0=dt$0' infile