Uma maneira de fazer isso com awk
é
awk -v RS=$'"\n"' 'END {print NR}' sample.csv
-
RS=$'"\n"'
define o eparator R ecord S (que é nova linha por padrão) para a string de três caracteres"
, newline,"
. Essa sintaxe pode funcionar apenas embash
. Isso fará com que seu arquivo seja decomposto nos seguintes registros:1:
"STAT","ID","DESC
2:
UPD", "1", "Updated
3:
CHG", "2", "Changed
4:
UPD", "3", "Updated.
Might have to update again
5:
UPD", "4", "Updated.
- once
- twice
- thrice
6:
DEL", "5", "unknown
7:
DEL", "6", "Deleted
Need to restore"
Isso pressupõe que não haja espaços em branco no arquivo.
-
'END {print NR}'
lê o arquivo até o final e imprime o número do registro - em outras palavras, o número de registros.
Arquivos de texto geralmente são considerados como uma sequência de linhas,
delimitado por caracteres de nova linha ou sequências de caracteres.
E, geralmente, um “registro” em um arquivo de texto é considerado como uma linha.
Mas awk
permite que você especifique um separador de registro diferente de nova linha.
Como a string quote-newline-quote aparece entre cada par de registros consecutivos no seu arquivo,
especificando-o como seu separador de registro divide o arquivo em (quase) os registros que você deseja.
Mas o separador de registro é como o muro entre dois quartos - não faz parte de nenhum deles.
No processamento normal de awk
, você vê registros que são linhas sem caracteres de nova linha
- eles são removidos. Da mesma forma, na minha resposta, as seqüências quote-quote-quote-quote são removidas.
Mas, como não há um separador de registros antes do primeiro registro ou após o último,
os primeiros e últimos caracteres de aspas não são removidos.
Se você quiser processar o arquivo, um registro por vez, esta solução pode não ser boa o suficiente, porque o primeiro registro e os últimos registros são tratados de maneira diferente. Concordo (de certa forma) com a recomendação de Glenn de que, para qualquer trabalho sério, você deve usar um "analisador de CSV adequado".