Ihr Problem ist nicht, dass Windows CRs hinzugefügt vor jedem LF (wie alle anderen so weit zu denken schien), ist es, dass die Datei eine neue Zeile fehlt (was Windows ist die CRLF-Kombination) am Ende der Datei. Alle Wetten sind deaktiviert, wenn ein UNIX-Befehl für eine Datei ausgeführt wird, die keinen abschließenden Zeilenumbruch hat, da sie zu diesem Zeitpunkt keine echte "Textdatei" mehr ist. Können Sie ändern, welches Werkzeug die Datei erzeugt, um eine abschließende neue Zeile zu erzeugen? Wenn nicht, dann tun Sie
printf '\r\n' >> file
bevor Sie awk oder ein anderes Werkzeug darauf ausführen. DANN können Sie dos2unix
oder irgendeinen anderen Vorschlag laufen lassen, um \r
s zu behandeln/zu entfernen, wenn notwendig. Zum Beispiel:
$ cat -v file
Helloworld^M
how are you^M
Helloworld$
Beachten Sie die $
die nach dem letzten Helloworld
meine Aufforderung sofort ist aufgrund der fehlenden Newline in der Datei. Jetzt:
$ awk -v BINMODE=3 '!seen[$0]++' file | cat -v
Helloworld^M
how are you^M
Helloworld
$
$ printf '\r\n' >> file
$
$ awk -v BINMODE=3 '!seen[$0]++' file | cat -v
Helloworld^M
how are you^M
$
$ dos2unix file
dos2unix: converting file file to Unix format...
$
$ awk '!seen[$0]++' file | cat -v
Helloworld
how are you
$
Ich habe -v BINDMODE=3
mit gawk zu verwenden, auf Cygwin über die untere Ebene Primitiven, um zu verhindern Strippen den \r
s vor der gaffen Skript sie sieht.
WRT die Frage in den Kommentaren, hier ist, warum Sie nicht nur auf jede Datei ausführen dos2unix, die auf Ihrem dodorstep auftaucht. Stellen Sie sich diese Datei, die Zeilenumbrüche (control-Ms) als Feldtrennzeichen verwendet:
$ printf 'a\rb\r\nd\r\rf\n' > file
$ cat -v file
a^Mb^M
d^M^Mf
$ awk -v BINMODE=3 -F'\r' '{for (i=1;i<=NF;i++) print NF, i, "<"$i">"; print "----"}' file
3 1 <a>
3 2 <b>
3 3 <>
----
3 1 <d>
3 2 <>
3 3 <f>
----
Wie Sie sehen awk erkennt korrekt, dass jede Zeile 3 Felder hat und das Feld 3 leer auf der Linie 1, während Feld 2 leer in Zeile 2.Lassen Sie uns jetzt dos2unix darauf laufen und versuchen Sie es erneut:
$ dos2unix file
dos2unix: converting file file to Unix format...
$ cat -v file
a^Mb
d^M^Mf
$ awk -v BINMODE=3 -F'\r' '{for (i=1;i<=NF;i++) print NF, i, "<"$i">"; print "----"}' file
2 1 <a>
2 2 <b>
----
3 1 <d>
3 2 <>
3 3 <f>
----
Wie Sie dos2unix
die Datei 3 durch Strippen das leere Feld aus der Leitung beschädigt sehen 1, weil, wenn es \r\n
sah angenommen, dass eine dos Linie Ende war, kein FS gefolgt von einem RS.
@WalterA, die '\ r' aus der ganzen Datei entfernen würde, nicht nur das Ende jeder Zeile, und in jedem Fall extra '\ r's ist nicht das OPs Problem, sein Problem ist eine fehlende Zeilenumbruch (CRLF in seinem Fall) am Ende der Datei. –