Zählen Sie die Anzahl der Zeilen in der TXT-Datei, wenn sich eine neue Zeile in den Daten befindet
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
Mit gnu-awk
kö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 entsprichtn+=gsub(/\n/, "&")
: Dummy durch sich\n
selbst ersetzen und\n
in variabel zählenn
END {print n}
: Drucktn
am Endesed '$s/$//' file
: Für die letzte Zeile wird eine neue Zeile hinzugefügt (falls diese fehlt)
Code-Demo
Mit der perl
letzten 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
s
Befehl 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
Wie Anubhava, jedoch mit GNU sed:
<infile sed '/"/ { :a; N; /"$/!ba; s/\n/ /g; }' | wc -l
Ausgabe:
3