Zählen Sie die Anzahl der Zeilen in der TXT-Datei, wenn sich eine neue Zeile in den Daten befindet

Nov 27 2020

Ich habe eine txt-Datei, die unten Daten enthält

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"

Jetzt können Sie sehen, dass meine letzten Spaltendaten einen neuen Zeilencharakter haben. Also, wenn ich den folgenden Befehl verwende

awk 'END{print NR}' file.txt

es gibt meine Länge ist 15, aber tatsächlich ist die Linienlänge 3. Bitte schlagen Sie den gleichen Befehl vor

Bearbeiteter Teil: Gemäß der angegebenen Antwort funktioniert das folgende Skript nicht, wenn am Ende der Eingabedatei kein Zeilenumbruch steht

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

Außerdem kann meine Datei 3-4 Millionen Datensätze enthalten. Das Konvertieren von Dateien in das Unix-Format wird also einige Zeit dauern, und das ist nicht meine Präferenz. Bitte schlagen Sie eine optimale Lösung vor, die in beiden Fällen funktionieren sollte

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

Name mobile URL Nachrichtentext ^ M $

Antworten

7 anubhava Nov 27 2020 at 09:49

Mit gnu-awkkönnen Sie dies mit einem benutzerdefinierten tun RS:

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

15001

Hier:

  • -v RS='"[^"]*"': Verwendet diesen regulären Ausdruck als Trennzeichen für Eingabedatensätze. Welches einer doppelten Zeichenfolge entspricht
  • n+=gsub(/\n/, "&"): Dummy durch sich \nselbst ersetzen und \nin variabel zählenn
  • END {print n}: Druckt nam Ende
  • sed '$s/$//' file: Für die letzte Zeile wird eine neue Zeile hinzugefügt (falls diese fehlt)

Code-Demo

1 Sundeep Nov 27 2020 at 10:14

Mit der perlletzten Zeile der Annahme endet immer mit einem Newline - Zeichen

$ perl -0777 -nE 'say s/"[^"]+"(*SKIP)(*F)|\n//g' ip.txt
3
  • -0777 Um die gesamte Eingabedatei als einzelne Zeichenfolge zu schlürfen, ist dies nicht geeignet, wenn die Eingabedatei sehr groß ist
  • Der sBefehl gibt die Anzahl der vorgenommenen Ersetzungen zurück, die hier verwendet werden, um die Anzahl der Zeilenumbrüche zu ermitteln
  • "[^"]+"(*SKIP)(*F) führt dazu, dass Zeilenumbrüche in doppelten Anführungszeichen ignoriert werden

Sie können den folgenden Befehl verwenden, wenn Sie die letzte Zeile zählen möchten, auch wenn sie nicht mit einem Zeilenumbruch endet.

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

Wie Anubhava, jedoch mit GNU sed:

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

Ausgabe:

3