2012-12-03 19 views

risposta

58

Si dovrebbe essere in grado di continuare le sequenze direttamente nella specifica esistente -f.

Per saltare sia 5 e 7, provare:

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

Come si sta per saltare una singola colonna sequenziale, questo può anche essere scritta come:

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

per andare avanti, se si voleva saltare 5, 7, e 11, si usa:

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

metterlo in una prospettiva più chiaro, è più facile da visualizzare quando si utilizzano le colonne di inizio/fine che si trovano rispettivamente all'inizio/fine dell'elenco di sequenze. Ad esempio, la segue stampa colonne da 2 a 20, saltando colonne 5 e 11:

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

Quindi, questo stampa "da 2 a 4", saltare 5, "6 a 10", saltare 11, e poi "Da 12 a 20".

+0

'6-6' probabilmente funziona, ma è più convenzionalmente scritto come' 6'. –

+0

@ JonathanLeffler Sì, lo so - ma ho mantenuto il '6-6' nell'esempio che mostra come apparirebbe per usare una gamma più ampia di colonne. Ad esempio, se l'OP voleva saltare 5 e 10, avrebbe bisogno di '-f-4,6-9,11-'. Questo può (o non può) essere visualizzato se l'ho collassato a solo '6'. Tuttavia, ho modificato per aggiungere un esempio anche con colonne sequenziali, quindi grazie per il suggerimento =] – newfurniturey

11

si è in grado di tagliare tutti i pari/dispari colonne utilizzando seguenti:

Ciò stampare tutte le colonne dispari

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

Per stampare tutti anche le colonne si potrebbe usare

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

Modificando il secondo numero di seq è possibile specificare quali colonne stampare.

Se la specifica le colonne da stampare è più complessa si potrebbe anche usare una "clausola di one-liner-se-" come

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) 

Ciò stampare tutte le colonne 1-5 - si può semplicemente modificare le condizioni per creare condizioni più complesse per specificare il tempo di una colonna devono essere stampate.

+0

Utilizzo in Mac Os (Darwin): echo 1,2,3,4,5,6,7,8,9, 10 | cut -d, -f $ (seq -s, 1 2 10) Ricevo questo errore cut: [-cf] list: i valori non possono includere zero ma se corro: echo 1,2,3,4 , 5,6,7,8,9,10 | cut -d, -f1,3,5,7,9 l'errore scompare. Qualcuno potrebbe provare a spiegarlo? Perché se seq viene usato dà questo errore? –

9

A volte è più facile pensare in termini di quali campi escludere.

Se il numero di campi non tagliati (non trattenuto nell'output) è ridotto, potrebbe essere più semplice utilizzare il flag --complement, ad es.per includere tutti i campi ad eccezione di 1-20 non 3, 7 e 12 - fare questo:

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

Piuttosto che

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

Lo stesso potrebbe essere fatto con il Perl
Perché utilizza 0- basata indicizzazione anziché in base 1-indicizzazione, i valori di campo sono compensati da 1

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

è equivalente a:

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

Se le virgole non sono necessari in uscita:

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