2016-03-29 9 views
1

Ich versuche, AWK zu verwenden, um jedes Wort in einem Textdokument in einer neuen Zeile zu platzieren. Ich weiß nicht wirklich, wie man AWK benutzt, aber ich habe einige Befehle online gefunden, die mein Problem lösen sollten. Ich habe die folgenden Befehle versucht:Verwenden von AWK, um jedes Wort in einer Textdatei in einer neuen Zeile zu platzieren

$ awk '{ for (i = 1; i <= NF; i++) print $i }' input.txt > output.txt 

und

$ awk '{c=split($0, s); for(n=1; n<=c; ++n) print s[n] }' input.txt > output.txt 

jedoch beide Befehle die gleiche Wirkung haben, das ist, dass alle Leerzeichen entfernt werden.

Aus Gründen der Klarheit sagen lässt, dass input.txt den Text enthält:

The fox jumped over the dog 

output.txt enthalten:

The 
fox 
jumped 
over 
the 
dog 

jedoch output.txt enthält:

Thefoxjumpedoverthedog 

Ich verwende Cygwin unter Windows 7, um diese Befehle zu verwenden. Gibt es etwas, das mir in den Befehlen fehlt?

+0

die auf Standard Awk Plattformen nicht reproduzierbar ist. Vielleicht druckt Ihr Awk Unix-Zeilenenden und das Werkzeug, mit dem Sie die Dateien untersuchen, weiß nicht, was Sie damit machen sollen? Die Awk-Skripte sind in Ordnung; Wie man sie auf ihrer Plattform richtig laufen lässt, ist hier die Frage, aber das ist nicht wirklich ein Programmierproblem. – tripleee

+0

@tripleee Danke, ich dachte, es würde etwas mit der Kompatibilität zwischen Win/Unix-Systemen zu tun haben. – hjalpmig

+0

ah, Kompatibilität zwischen Windows und Unix, yep. Probiere 'cat -vet-Datei' aus. Wenn Sie '^ M $' am Zeilenende sehen, verwenden Sie 'dos2unix file', um in das Unix-Format zu konvertieren. (Oder wenn ich die "Richtung" Ihrer Daten missverstehe, gibt es auch "unix2dos file". Viel Glück. – shellter

Antwort

2

Nach der manpage, print in awk druckt seine Argumente:

durch den aktuellen Ausgabefeld Separator getrennt, und beendet durch den Ausgang voneinander zu trennen sind

So Ihre erste Befehl in Ordnung ist, Sie müssen jedoch sicherstellen, dass das Ausgabesatztrennzeichen eine neue Zeile ist. Der Standardausgabesatz Separator ist ein Newline, aber versuchen Sie sicherstellen, dass:

awk -v ORS='\n' '{ for (i = 1; i <= NF; i++) print $i }' input.txt > output.txt 

auf Cygwin, nur Sie können mit Windows/DOS-Zeilenenden in Frage laufen. Versuchen Sie auch ORS='\r\n'. Alternativ kann der Ausgang über unix2dos geleitet werden.

+0

Dies auch mir den gleichen fehlerhaften Ausgang geben – hjalpmig

+0

Können Sie mit versuchen' '\ r \ n'', falls es sich um eine unix2dos Art von Problem? – szym

+0

hinzufügen '\ r \ n' hat es gelöst, danke. – hjalpmig

2

eine weitere Alternative

echo "the fox jumped over the dog" | awk -v OFS="\n" '{$1=$1}1' 

aus einer Datei lesen awk ... inputfile

aber ich bin mir nicht sicher, dass es Ihren Fall lösen. Wenn Sie awk gebrochen ist, können Sie versuchen tr

echo ... | tr ' ' '\n' 

tun.

+0

Dein erster Befehl funktioniert bei mir. Wie kann ich es so ändern, dass es den Text nicht aus einer Datei liest und die Ausgabe in einer anderen Datei speichert? – hjalpmig

+0

gleiche wie Sie sich normalerweise tun, 'awk ... inputfile> outputfile' – karakfa

0

Sie können dies in Perl trivialer Weise tun:

$ echo "The fox jumped over the dog" | perl -ple 's/\h/\n/g' 
The 
fox 
jumped 
over 
the 
dog 

Gleiche Werke in awk:

$ echo "The fox jumped over the dog" | awk '{gsub(/ /,"\n"); print}' 
The 
fox 
jumped 
over 
the 
dog 
Verwandte Themen