Le opzioni da 1 a 3 hanno problemi con più spazi bianchi (ma sono semplici). Questo è il motivo per sviluppare le opzioni 4 e 5, che elaborano più spazi bianchi senza problemi. Ovviamente, se le opzioni 4 o 5 vengono utilizzate con n=0
entrambe, manterrà qualsiasi spazio bianco iniziale comen=0
non suddivisi.
opzione 1
Una semplice soluzione di taglio (funziona con singoli delimitatori):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
opzione 2
Forzare un ricalcolo di awk a volte risolve il problema (funziona con alcune versioni di awk) degli spazi iniziali aggiunti:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Opzione 3
La stampa di ogni campo formattato con printf
darà più controllo:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8
Tuttavia, tutte le risposte precedenti modificano tutte le FS tra i campi in OFS. Creiamo un paio di soluzioni a questo.
Opzione 4
Un ciclo con sottotitoli per rimuovere campi e delimitatori è più portabile e non attiva una modifica di FS in OFS:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4 5 6 7 8
NOTA: "^ [" FS "] *" accetta un input con spazi iniziali.
Opzione 5
È del tutto possibile creare una soluzione che non aggiunga spazi bianchi iniziali o finali extra e preservare gli spazi bianchi esistenti usando la funzione gensub
di GNU awk, come questo:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
Può anche essere utilizzato per scambiare un elenco di campi dato un conteggio n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
b=gensub("^(.*)("a")","\\1",1);
print "|"a"|","!"b"!";
}'
|4 5 6 7 8 | ! 1 2 3 !
Naturalmente, in tal caso, l'OFS viene utilizzato per separare entrambe le parti della riga e lo spazio bianco finale dei campi viene ancora stampato.
Nota 1: ["FS"]*
viene utilizzato per consentire spazi iniziali nella riga di input.
cut -f3-
?