2017-04-26 3 views
0

Ich möchte eine dreispaltige Textdatei in drei separate Dateien mit jeweils einer Zeile transponieren. Mit anderen Worten, nehmen Sie diese Datei:Probleme beim Transponieren von Spalten mit Schnitt

in_file

1 22 0.8 
4 21 0.73 
3 30 1.56 
5 12 0.92 

und produzieren die folgenden drei Dateien:

out_file1

1 4 3 5 

out_file2

22 21 30 12 

out_file3

0.8 0.73 1.56 0.92 

Ich versuchte Schnitt zu verwenden, dies zu tun:

cut -d' ' -f1 in_file | tr -s '\n' '\t' >> out_file1 
cut -d' ' -f2 in_file | tr -s '\n' '\t' >> out_file2 
cut -d' ' -f3 in_file | tr -s '\n' '\t' >> out_file3 

aber, was ich bekomme, ist dies:

out_file1

1 4 3 5 

out_file2

out_file3

0.8 
    0.73 
    1.56 
    0.92 

ich kann nicht herausfinden, warum es für die ersten 2 Spalten arbeitet und nicht die dritte.

Dankbar für jede Hilfe!

+0

Sind Sie sicher, dass das Trennzeichen immer ein einzelnes Leerzeichen ist? –

+0

Das Trennzeichen ist immer ein Tabulator. Tatsächlich wurde mir klar, dass ein Fehler in meinem Post oben ist - ich habe jetzt aktualisiert, wie die out_file3 tatsächlich aussieht (ein neuer Tab am Anfang jeder Zeile). – Neuroguy

+0

Der Eingabe-Begrenzer - ist es ein Tab oder ein Leerzeichen? Wenn es ein einzelnes Leerzeichen ist, funktioniert Ihr Code für mich (Centos 6.5) Sie könnten 'cat in_file | tr -s "" 'vor dem Schnitt – mousomer

Antwort

0

Ihr Problem ist höchstwahrscheinlich das Trennzeichen, das Sie als Literal Registerkarte statt \t eingegeben haben, h ere ist eine Schleife, die alle drei Dateien tut:

for i in {1..3}; do 
    cut -d$'\t' "-f${i}" in_file | column >> "outfile_${i}.txt" 
done 

Hier haben wir eine Schleife über eine sequense von {1..3}, setzen Sie das Trennzeichen auf die Registerkarte mit der speziellen Syntax: -d$'\t', Rohr die Daten zu column die automatisch Linien, die die Werte und anhängen das zur richtigen Datei.

+0

danke für die Eingabe. Ich habe versucht, -d $ '\ t' anstelle einer literalen Registerkarte anzugeben, aber es erzeugt das gleiche Ergebnis. Allerdings habe ich herausgefunden, dass das Problem das \ n war. Die Textdateien, die ich lese, werden von einem in PHP geschriebenen Skript erzeugt, in dem der Zeilenumbruch \ r \ n ist, im Gegensatz zu \ n in Unix. – Neuroguy

+0

Tab ist das Standardtrennzeichen, daher sollten Sie die Option '-d' einfach überspringen können. –

0

ein bisschen schneller, wenn awk availble ist

awk '{ for(i=1; i<=NF; i++) printf("%s ", $i) > ("file" i)}' YourFile 

Anmerkung: - > und nicht >> weil awk die Umleitung nur bei Dateiöffnung bewerten (so Schöpfung und in diesem Fall nicht hinzufügen)

für Ihr Schnittproblem, ist Trennzeichen immer 1 Leerzeichen zwischen Spalte

Verwandte Themen