Molte soluzioni con awk lasciano spazio. Le opzioni qui evitano questo problema.
opzione 1
Una soluzione di taglio semplice (funziona solo con delimitatori singoli):
command | cut -d' ' -f3-
opzione 2
Forzare un nuovo calcolo di awk a volte rimuove lo spazio iniziale aggiunto (OFS) rimasto rimuovendo i primi campi (funziona con alcune versioni di awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Opzione 3
La stampa di ogni campo formattato con printf
darà un maggiore controllo:
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8
Tuttavia, tutte le risposte precedenti cambiano tutte le FS ripetute tra i campi in OFS. Costruiamo un paio di opzioni che non lo fanno.
Opzione 4 (consigliata)
Un ciclo con sub per rimuovere campi e delimitatori nella parte anteriore.
E usando il valore di FS invece di spazio (che potrebbe essere cambiato).
È più portabile, e non innesca un cambiamento di FS a OFS:
NOTA: L' ^[FS]*
è di accettare un ingresso con spazi iniziali.
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3 4 5 6 7 8
Opzione 5
È del tutto possibile creare una soluzione che non aggiunga spazi extra (iniziali o finali) e preservare spazi bianchi esistenti usando la funzione gensub
di GNU awk, in quanto:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{ print(gensub(a""b""c,"",1)); }'
3 4 5 6 7 8
Può anche essere usato per scambiare un gruppo di campi dato un conteggio n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{
d=gensub(a""b""c,"",1);
e=gensub("^(.*)"d,"\\1",1,$0);
print("|"d"|","!"e"!");
}'
|3 4 5 6 7 8 | ! 1 2 !
Naturalmente, in tal caso, OFS viene utilizzato per separare entrambe le parti della linea e lo spazio bianco finale dei campi viene comunque stampato.
NOTA: [FS]*
viene utilizzato per consentire spazi iniziali nella riga di input.
grep | awk
è un antipasto - vuoiawk '/!/ { print $2 }'