Compter le nombre de lignes dans le fichier txt lorsque la nouvelle ligne est à l'intérieur des données

Nov 27 2020

J'ai un fichier txt qui contient les données ci-dessous

Name    mobile  url message text
test11  1234567890  www.google.com  "Data Test New
Date:27/02/2020
Items: 1
Total: 3
Regards
ABC DATa
Ph:091 : 123456789"
test12  1234567891  www.google.com  "Data Test New one
Date:17/02/2020
Items: 26
Total: 5
Regards
user test
Ph:091 : 433333333"

Vous pouvez maintenant voir que mes dernières données de colonne ont un nouveau caractère de ligne. donc quand j'utilise la commande ci-dessous

awk 'END{print NR}' file.txt

cela donne ma longueur est de 15 mais en fait la longueur de la ligne est de 3. Veuillez suggérer une commande pour le même

Partie modifiée: selon la réponse donnée, le script ci-dessous ne fonctionne pas s'il n'y a pas de nouvelle ligne à la fin du fichier d'entrée

awk -v RS='"[^"]*"' '{gsub(/\n/, " ", RT); ORS=RT} END{print NR "\n"}' test.txt 

Mon fichier peut également contenir 3-4 millions d'enregistrements. Donc, la conversion d'un fichier au format unix prendra du temps et ce n'est pas ma préférence. Veuillez donc suggérer une solution optimale qui devrait fonctionner dans les deux cas

head 5.csv | cat -A  
Above command is giving me the output

Nom du texte du message de l'URL mobile ^ M $

Réponses

7 anubhava Nov 27 2020 at 09:49

En utilisant, gnu-awkvous pouvez le faire en utilisant un personnalisé RS:

awk -v RS='"[^"]*"' '{gsub(/(\r?\n){2,}/, "\n"); n+=gsub(/\n/, "&")}
END {print n}' <(sed '$s/$//' file)

15001

Ici:

  • -v RS='"[^"]*"': Utilise cette expression régulière comme séparateur d'enregistrement d'entrée. Qui correspond à une chaîne entre guillemets
  • n+=gsub(/\n/, "&"): Remplacement factice \npar lui-même et compte \ndans la variablen
  • END {print n}: Imprime nà la fin
  • sed '$s/$//' file: Pour la dernière ligne ajoute une nouvelle ligne (au cas où elle serait manquante)

Démo de code

1 Sundeep Nov 27 2020 at 10:14

Avec perl, en supposant que la dernière ligne se termine toujours par un caractère de nouvelle ligne

$ perl -0777 -nE 'say s/"[^"]+"(*SKIP)(*F)|\n//g' ip.txt
3
  • -0777 pour slurp le fichier d'entrée entier comme une seule chaîne, donc cela ne convient pas si le fichier d'entrée est très volumineux
  • la scommande renvoie le nombre de substitutions effectuées, qui est utilisé ici pour obtenir le nombre de sauts de ligne
  • "[^"]+"(*SKIP)(*F) fera ignorer les retours à la ligne entre guillemets

Vous pouvez utiliser la commande ci-dessous si vous souhaitez compter la dernière ligne même si elle ne se termine pas par un caractère de nouvelle ligne.

perl -0777 -nE 'say scalar split /"[^"]+"(*SKIP)(*F)|\n/' ip.txt
Thor Nov 27 2020 at 13:10

Identique à anubhava mais avec GNU sed:

<infile sed '/"/ { :a; N; /"$/!ba; s/\n/ /g; }' | wc -l

Production:

3