Aufteilen einer Datei mit durch Tabulatoren getrennten Zeilen in zwei Dateien

Aufteilen einer Datei mit durch Tabulatoren getrennten Zeilen in zwei Dateien

Wie kann ich sedeine Datei in zwei Teile aufteilen, sodass die Datei, die den Inhalt enthält,

eric    shwartz
david    snyder

wobei die 4 Leerzeichen zwischen den Einträgen eigentlich Tabulatoren in zwei Dateien sind, wie zum Beispiel:

file1:

eric
david

file2:

shwartz
snyder

Daher wird alles nach dem Tabulator in jeder Zeile in eine andere Datei eingefügt.

Antwort1

Eine Lösung könnte sein:

awk '{ print $1 > "file1"; print $2 > "file2"}' file 

Antwort2

Muss es ein Skript sein? Wenn nicht, können Sie Folgendes tun:

cut -f 1 file > file1
cut -f 2 file > file2

cutwählt eine Spalte aus (standardmäßig durch Tabulator getrennt). -f ist ein Flag, das eine Zahl als Argument annimmt, und diese Zahl ist eine Spaltennummer.

Antwort3

Ich glaube nicht, dass es einfacher sein kann alsawkAnsatz,hier ist also eine Perl-Lösung, die für eine beliebige Anzahl von Spalten funktioniert und jede in einer eigenen Datei speichert:

perl -ane 'unless($handles[0]){
            for(1..$#F+1){
                open(my $fh, ">","file$_"); 
                $handles[$_-1] = $fh
            }
           } 
           for my $i (0..$#F){
                print { $handles[$i] } "$F[$i]\n"
           }' file 

Gegeben sei eine Eingabedatei wie diese:

$ cat file
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad

Das obige Skript erstellt Dateien, die file1jeweils file4die entsprechende Spalte enthalten.


Natürlich können Sie genau dasselbe in tun awk, viel einfacher und eleganter, aber wo bleibt da der Spaß?

awk '{for(i=1;i<=NF;i++){print $i > "file"i}}' file 

Antwort4

moreutils (in vielen Distro-Repos verfügbar oderhttp://joeyh.name/code/moreutils/) verfügt über einige praktische Dienstprogramme, von denen eines hier hilft:

pee 'cut -f1 >file1' 'cut -f2 >file2' < file

verwandte Informationen