J'ai un fichier .csv qui a certaines valeurs formatées comme des paragraphes avec des sauts de ligne ou parfois des puces.
"STAT","ID","DESC"
"UPD", "1", "Updated"
"CHG", "2", "Changed"
"UPD", "3", "Updated.
Might have to update again"
"UPD", "4", "Updated.
- once
- twice
- thrice
"
"DEL", "5", "unknown"
"DEL", "6", "Deleted
Need to restore"
J'ai besoin de compter le nombre d'enregistrements, utilisé par awk comme ci-dessous puisque je savais que la 2e colonne était un identifiant unique mais renvoyait plus que le mien. Le texte ci-dessus est bien sûr un mannequin, car je ne suis pas autorisé à partager l'original mais j'ai essayé de réfléchir aussi fidèlement que possible.
awk '{print $2}' FS="," sample.csv | wc -l
J'ai même imprimé la première colonne en utilisant awk '{print $ 1}' pour vérifier uniquement les valeurs de la première colonne, mais la sortie affiche les parties de départ de la nouvelle ligne dans les paragraphes.
S'il vous plaît laissez-moi savoir si des informations supplémentaires sont nécessaires et je mettrai à jour la question.
Réponses:
Une façon de faire
awk
est avecRS=$'"\n"'
définit la R ECORD S eparator (qui est de saut de ligne par défaut) pour la chaîne de trois caractères"
, saut de ligne,"
. Cette syntaxe pourrait ne fonctionner que dansbash
. Cela entraînera la décomposition de votre fichier dans les enregistrements suivants: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
sept:
DEL", "6", "Deleted
Need to restore"
Cela suppose qu'il n'y a pas de blancs de fin dans le fichier.
'END {print NR}'
lit le fichier jusqu’à la fin puis imprime le numéro de l’enregistrement, c’est-à-dire le nombre d’enregistrements.Les fichiers texte sont généralement considérés comme une séquence de lignes délimitée par des caractères de nouvelle ligne ou des séquences de caractères. Et, généralement, un «enregistrement» dans un fichier texte est considéré comme une ligne. Mais
awk
vous permet de spécifier un séparateur d’enregistrement autre que newline. Étant donné que la chaîne quote-newline-quote apparaît entre chaque paire d' enregistrements consécutifs de votre fichier, le spécifier comme séparateur d'enregistrement divise le fichier en enregistrements (presque identiques) aux enregistrements souhaités.Mais le séparateur d'enregistrement est comme le mur entre deux pièces: il ne fait partie d'aucune des deux. En
awk
traitement normal , les enregistrements sont des lignes sans caractères de nouvelle ligne - ils sont supprimés. De même, dans ma réponse, les séquences quote-newline-quote sont supprimées. Mais, puisqu'il n'y a pas de séparateur d'enregistrement avant ou après le dernier enregistrement, les tout premiers et derniers caractères de citation ne sont pas supprimés.Si vous souhaitez traiter le fichier, enregistrement par enregistrement, cette solution risque de ne pas suffire, car le premier enregistrement et les derniers enregistrements sont traités différemment. Je suis (un peu) d'accord avec la recommandation de Glenn selon laquelle, pour tout travail sérieux, vous devriez utiliser un «analyseur syntaxique CSV approprié».
la source
Je recommande fortement de choisir une langue avec un analyseur CSV approprié. J'aime le rubis pour ça, c'est très concis:
J'ai dû modifier les séparateurs de colonnes dans la ligne d'en-tête pour ajouter des espaces.
la source