2009-06-24 15 views
25

ich so etwas wie dies tun wollen:Erzwingen der Reihenfolge der Ausgabefelder von Schnittbefehl

cat abcd.txt | cut -f 2,1 

und ich möchte, dass die Ordnung 2 und dann 1 in der Ausgabe zu sein. Auf der Maschine, die ich teste (FreeBSD 6), passiert dies nicht (das Drucken in der Reihenfolge 1,2). Kannst du mir sagen, wie ich das mache?

Ich weiß, dass ich immer ein Shell-Skript schreiben kann, um das umzukehren, aber ich suche nach etwas, das die "cut" -Befehlsoptionen verwendet.

Ich denke, ich verwende Version 5.2.1 von Coreutils mit Schnitt.

Antwort

27

Dies kann nicht mit Schnitt durchgeführt werden. Entsprechend der man-Seite:

Ausgewählte Eingabe wird in der gleichen Reihenfolge geschrieben, in der sie gelesen wird, und wird genau einmal geschrieben.

Stattdessen können Sie es tun awk verwendet wird, wie folgt aus:

awk '{print($2,"\t",$1)}' abcd.txt 

Ersetzen Sie die \ t mit was auch immer Sie verwenden als Feldtrennzeichen.

11

Lars 'Antwort war großartig, aber ich fand eine noch bessere. Das Problem mit seinem ist es Übereinstimmungen \ t \ t wie keine Spalten. Um dies zu beheben Verwenden Sie die folgenden:

awk -v OFS=" " -F"\t" '{print $2, $1}' abcd.txt 

Wo:

-F"\t" ist, was auf genau (Tabs) zu schneiden.

-v OFS=" " ist, was mit (zwei Räume)

Beispiel zu trennen:

echo 'A\tB\t\tD' | awk -v OFS=" " -F"\t" '{print $2, $4, $1, $3}' 

Diese Ausgänge:

B D A  
+1

In Cygwin hatte ich mit ersetzen -F "\ t" - F \ t um das zu machen. –