2016-07-15 3 views
1

Ich habe eine Datei mit einer einzigen Spalte und 10 Zeilen. Jede Spalte hat die gleiche Anzahl von Zeichen (5). Aus dieser Datei möchte ich eine Datei mit 10 Zeilen und 5 Spalten bekommen, wobei jede Spalte nur 1 Zeichen hat. Ich habe keine Ahnung, wie man das in Linux macht. Irgendwelche Hilfe? Würde AWK das tun?Spalte eine Spalte von jeder in "n" Spalten mit je einem Zeichen

Die realen Daten haben jedoch viel mehr Zeilen (> 4K) und Zeichen (> 500K). Hier ist eine kurze Version der realen Daten:

31313 
30442 
11020 
12324 
00140 
34223 
34221 
43124 
12211 
04312 

gewünschte Ausgabe:

3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 

Dank!

+2

[Bearbeiten] Ihre Frage, uns zu zeigen, wie die Ausgabe aussehen würde, auch. –

Antwort

2

diese Weise können Sie sed auch:

sed 's/./& /g; s/ $//' file 

3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 
+1

Es hat perfekt funktioniert! Vielen Dank! – NickSerao

+1

mit GNU sed, können Sie 'sed 's /./ &/2g'' – Sundeep

+0

Ja sehr guter Punkt @Sundeep tun – anubhava

0

Seltsamerweise ist dies nicht trivial mit den meisten Standard-Unix-Tools zu tun (Update: except, apparently, with awk). Ich würde Python verwenden:

python -c 'import sys; map(sys.stdout.write, map(" ".join, sys.stdin))' in.txt > new.txt 

(. Dies ist nicht der größte idiomatische Python, aber es reicht für einfache Einzeiler)

3

Ich glaube, das tut, was Sie wollen:

$ awk -F '' '{ $1 = $1 }1' file 
3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 

Das Eingabefeldtrennzeichen wird auf die leere Zeichenfolge gesetzt, sodass jedes Zeichen als Feld behandelt wird. $1 = $1 bedeutet, dass awk jeden Datensatz "berührt", wodurch er neu formatiert wird, wobei das Ausgabefeldtrennzeichen (ein Leerzeichen) zwischen jedem Zeichen eingefügt wird. 1 ist die kürzeste "wahre" Bedingung, die awk veranlasst, jeden Datensatz zu drucken.

Beachten Sie, dass das Verhalten beim Festlegen des Feldtrennzeichens auf eine leere Zeichenfolge nicht korrekt definiert ist, daher möglicherweise nicht auf Ihrer Version von awk funktioniert. Möglicherweise stellen Sie fest, dass das Feldtrennzeichen anders z. mit -v FS= funktioniert für Sie.

Alternativ können Sie mehr oder weniger die gleiche Sache in Perl tun:

perl -F -lanE 'say "@F"' file 

-a spaltet jeden Eingabesatz in die spezielle Anordnung @F. -F gefolgt von nothing setzt das Eingabefeldtrennzeichen auf die leere Zeichenfolge. Die Anführungszeichen um @F bedeuten, dass das Listentrennzeichen (standardmäßig ein Leerzeichen) zwischen jedem Element eingefügt wird.

+0

Danke für Ihre Antwort! Ich habe das versucht, aber folgende Meldung erhalten: "awk: Feldtrennzeichen FS ist leer". Also, ich habe darüber gegoogelt und ich habe deinen Code in "awk -v FS = '{$ 1 = $ 1} 1' Datei" geändert und es hat funktioniert !!! Danke für Ihre Hilfe! – NickSerao

0

andere Unix-Werkzeugkette für diese Aufgabe

$ while read line; do echo $line | fold -w1 | xargs; done < file 

3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 
Verwandte Themen