Arquivos CSV são complicados. Partindo do pressuposto de que Somedata
é um campo de dados corretamente citado que pode conter vírgulas, podemos substituir o delimitador por algo que definitivamente não está ocorrendo nos dados, por exemplo, um caractere de tabulação ( $'\t'
na maioria dos shells modernos) ( você vai mudar isso para algo que você sabe que funciona). Se os campos de dados estiverem livres de vírgulas, ignore os csvformat
bits aqui.
Usando csvkit
:
$ csvformat -D$'\t' data.csv
SomeData SomeData 1 SomeData
SomeData SomeData 1 SomeData
SomeData SomeData 2 SomeData
SomeData SomeData 3 SomeData
SomeData SomeData 1 SomeData
etc.
Podemos passar isso para um script awk
que faz o trabalho real de encontrar os grupos.
NR > 1 && $3 == count + 1 {
# This line is part of the set.
++count; # We expect this value on the next line.
++set_size; # This is the number of lines in the set.
# Output previous line and remember this line.
print previous_line;
previous_line = $0;
# Continue with next line.
next;
}
set_size > 0 && $3 != count + 1 {
# This line is not part of the set, but we're currently tracking a
# set. This means that the set ended, so output the last line of
# the set.
print previous_line;
set_size = 0;
}
{
# This line might be part of the next set.
count = $3;
previous_line = $0
}
Executando:
$ csvformat -D$'\t' data.csv | awk -F$'\t' -f script.awk
SomeData SomeData 1 SomeData
SomeData SomeData 2 SomeData
SomeData SomeData 3 SomeData
SomeData SomeData 1 SomeData
SomeData SomeData 2 SomeData
SomeData SomeData 3 SomeData
SomeData SomeData 4 SomeData
SomeData SomeData 5 SomeData
Depois, basta recuperá-lo no formulário padrão delimitado por vírgulas:
$ csvformat -D$'\t' data.csv | awk -F$'\t' -f script.awk | csvformat -d$'\t'
SomeData,SomeData,1,SomeData
SomeData,SomeData,2,SomeData
SomeData,SomeData,3,SomeData
SomeData,SomeData,1,SomeData
SomeData,SomeData,2,SomeData
SomeData,SomeData,3,SomeData
SomeData,SomeData,4,SomeData
SomeData,SomeData,5,SomeData
Se os dados estiverem livres de vírgulas dentro dos campos de dados, você poderá deixar csvformat
completamente:
$ awk -F',' -f script.awk data.csv
SomeData,SomeData,1,SomeData
SomeData,SomeData,2,SomeData
SomeData,SomeData,3,SomeData
SomeData,SomeData,1,SomeData
SomeData,SomeData,2,SomeData
SomeData,SomeData,3,SomeData
SomeData,SomeData,4,SomeData
SomeData,SomeData,5,SomeData