it-swarm.com.de

Swap zwei Spalten - awk, sed, Python, Perl

Ich habe Daten in einer großen Datei (280 Spalten breit, 7 Millionen Zeilen lang!) Und muss die ersten beiden Spalten austauschen. Ich glaube, ich könnte dies mit einer Art awk for-Schleife tun, um $ 2, $ 1 und dann einen Bereich bis zum Ende der Datei zu drucken - aber ich weiß nicht, wie ich den Bereichsteil ausführen soll, und ich kann $ 2 nicht drucken , $ 1, $ 3 ... $ 280! Die meisten Antworten auf den Spaltentausch, die ich hier gesehen habe, beziehen sich auf kleine Dateien mit einer überschaubaren Anzahl von Spalten. Daher benötige ich etwas, das nicht von der Angabe jeder Spaltennummer abhängt.

Die Datei ist tabulatorgetrennt:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989
49
Charley Farley

Sie können dies tun, indem Sie die Werte der ersten beiden Felder austauschen:

awk ' { t = $1; $1 = $2; $2 = t; print; } ' input_file
86
perreal

Ich habe die Antwort von perreal mit cygwin auf einem Windows-System mit einer tabulatorgetrennten Datei versucht. Es hat nicht funktioniert, weil das Standardtrennzeichen Leerzeichen ist.

Wenn Sie auf dasselbe Problem stoßen, versuchen Sie Folgendes:

awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file

Eingehendes Trennzeichen ist definiert durch -F $'\t' und das Trennzeichen für die Ausgabe von OFS=$'\t'.

awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file > output_file
19
emi-le

Versuchen Sie dies relevanter für Ihre Frage:

awk '{printf("%s\t%s\n", $2, $1)}' inputfile
4
Pradyumna Sagar

Haben Sie versucht, den Befehl cut zu verwenden? Z.B.

cat myhugefile | cut -c10-20,c1-9,c21- > myrearrangedhugefile
4
Robbie Dee

Dies könnte für Sie funktionieren (GNU sed):

sed -i 's/^\([^\t]*\t\)\([^\t]*\t\)/\2\1/' file
4
potong

Dies ist auch in Perl einfach:

Perl -pe 's/^(\S+)\t(\S+)/$2\t$1/;' file > outputfile
3
Aaron Lawson

Sie können dies in Perl tun:

Perl -F\\t -nlae 'print join("\t", @F[1,0,2..$#F])' inputfile

Das -F gibt das Trennzeichen an. In den meisten Shells müssen Sie einem Backslash einen anderen voranstellen, um diesem zu entkommen. Auf einigen Plattformen -F impliziert automatisch -n und -a so können sie fallen gelassen werden.

Für dein Problem brauchst du nicht -l weil die letzten Spalten zuletzt in der Ausgabe erscheinen. Wenn jedoch in einer anderen Situation die letzte Spalte zwischen anderen Spalten angezeigt werden muss, muss das Zeilenumbruchzeichen entfernt werden. Das -l switch kümmert sich darum.

Das "\t" in join kann in irgendetwas anderes geändert werden, um ein anderes Trennzeichen in der Ausgabe zu erzeugen.

2..$#F gibt einen Bereich von 2 bis zur letzten Spalte an. Wie Sie vielleicht vermutet haben, können Sie innerhalb der eckigen Klammern jede einzelne Spalte oder jeden Spaltenbereich in der gewünschten Reihenfolge einfügen.

2
Loax