2012-12-03 18 views
41

gegebenen EingangsSchnitt Befehl mehrere Spalten

 
echo 1,2,3,4,5,6,7,8,9,...100 

Wenn ich Spalten schneiden 5 entfernen möchten kann ich

 
cut -d, -f-4,6- 

tun, was, wenn ich 7 mehrere nicht aufeinanderfolgenden Spalten wie 5, schneiden möchten , usw. gibt es einen Einliner?

Antwort

58

Sie sollten die Sequenzen direkt in Ihrer bestehenden -f Spezifikation fortsetzen können.

beide überspringen 5 und 7, versuchen:

cut -d, -f-4,6-6,8- 

Wie Sie eine einzelne sequentielle Spalte sind Skipping, das auch geschrieben werden kann als:

cut -d, -f-4,6,8- 

es in Gang zu halten, wenn Sie wollten 5, 7 überspringen und 11, verwenden Sie:

cut -d, -f-4,6-6,8-10,12- 

um es in eine Entwarnung Perspektive zu setzen, ist es leichter zu visualisieren wenn Sie Start-/Endspalten verwenden, die jeweils am Anfang/Ende der Sequenzliste stehen. Zum Beispiel werden die folgenden Spalten 2 bis 20 drucken, Spalten 5 und 11 übersprungen:

cut -d, -f2-4,6-10,12-20 

ja, wird "2 bis 4" drucken, überspringen 5, "6 bis 10" überspringen 11, und dann "12 bis 20".

+0

'6-6' wahrscheinlich funktioniert, aber mehr wird üblicherweise als' 6 'geschrieben. –

+0

@JonathanLeffler Ja, ich weiß - aber ich habe die '6-6' im Beispiel der Show behalten, wie es aussehen würde, um eine größere Auswahl an Spalten zu verwenden. Zum Beispiel, wenn das OP 5 und 10 überspringen wollte, würde er '-f-4,6-9,11-' benötigen. Dies kann (oder auch nicht) visualisiert werden, wenn ich es auf "6" reduziert habe. Allerdings habe ich bearbeitet, um ein Beispiel mit sequenziellen Spalten hinzuzufügen - also danke für den Tipp =] – newfurniturey

11

Sie sind in der Lage, alle ungeraden/geraden Spalten unter Verwendung seq zu schneiden:

Dies würde alle ungeraden Spalten drucken

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10) 

alle geraden Spalten drucken Sie

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10) 

verwenden könnte Durch Ändern der zweiten Anzahl von Seq können Sie angeben, welche Spalten gedruckt werden sollen.

Wenn die Spezifikation, die Spalten zu drucken ist komplexer Sie auch eine „one-liner-if-Klausel“ wie

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done) 

Diese alle Spalten von 1 bis 5 würde drucken verwenden könnte - können Sie einfach ändern Die Bedingungen für die Erstellung komplexerer Bedingungen zur Angabe des Wetters einer Spalte müssen gedruckt werden.

+0

Verwendung in Mac OS (Darwin): echo 1,2,3,4,5,6,7,8,9, 10 | Schnitt -d, -f $ (Seq -s, 1 2 10) Ich bekomme diesen Fehler Schnitt: [-cf] Liste: Werte dürfen nicht Null aber wenn ich laufen: Echo 1,2,3,4 , 5,6,7,8,9,10 | Schnitt -d, -f1,3,5,7,9 der Fehler verschwindet. Könnte jemand versuchen, das zu erklären? Warum, wenn Seq verwendet wird, gibt diesen Fehler? –

9

Manchmal ist es einfacher zu überlegen, welche Felder ausgeschlossen werden sollen.

Wenn die Anzahl der nicht ausgeschnittenen Felder (die nicht in der Ausgabe enthalten sind) klein ist, kann es einfacher sein, das Flag --complement zu verwenden, z.alle Felder 1-20 Ausnahme nicht zählen 3, 7 und 12 - dies tun:

cut -d, --complement -f3,7,12 <inputfile 

Statt

cut -d, -f-2,4-6,8-11,13- 
0

das gleiche mit Perl
getan werden könnte, weil es verwendet 0- basierend Indizierung anstelle von 1-Basis-Indizierung werden die Feldwerte Offset von 1

perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'  

entspricht:

cut -d, -f2-4,6-10,12-20 

Wenn die Kommas in der Ausgabe nicht benötigt werden:

perl -F, -lane 'print "@F[1..3,5..9,11..19]"'