Compter le nombre de lignes dans le fichier txt lorsque la nouvelle ligne est à l'intérieur des données
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
En utilisant, gnu-awk
vous 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 guillemetsn+=gsub(/\n/, "&")
: Remplacement factice\n
par lui-même et compte\n
dans la variablen
END {print n}
: Imprimen
à la finsed '$s/$//' file
: Pour la dernière ligne ajoute une nouvelle ligne (au cas où elle serait manquante)
Démo de code
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
s
commande 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
Identique à anubhava mais avec GNU sed:
<infile sed '/"/ { :a; N; /"$/!ba; s/\n/ /g; }' | wc -l
Production:
3