Większość rozwiązań z awk pozostawia miejsce. Opcje tutaj unikają tego problemu.
opcja 1
Proste rozwiązanie cięcia (działa tylko z pojedynczymi ogranicznikami):
command | cut -d' ' -f3-
Opcja 2
Wymuszanie ponownego obliczenia awk czasami usuwa dodatkową przestrzeń wiodącą (OFS) pozostałą przez usunięcie pierwszych pól (działa z niektórymi wersjami awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Opcja 3
Drukowanie każdego pola sformatowanego za pomocą printf
daje większą kontrolę:
$ 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
Jednak wszystkie poprzednie odpowiedzi zmieniają wszystkie powtarzane FS między polami na OFS. Zbudujmy kilka opcji, które tego nie robią.
Opcja 4 (zalecana)
Pętla z sub do usuwania pól i ograniczników z przodu.
I używając wartości FS zamiast spacji (którą można zmienić).
Jest bardziej mobilny, a nie powoduje zmiany FS OFS:
UWAGA:^[FS]*
jest zaakceptować wejście z czołowych miejsc.
$ 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
Opcja 5
Jest całkiem możliwe zbudowanie rozwiązania, które nie dodaje dodatkowych (początkowych lub końcowych) białych znaków i zachowuje istniejące białe znaki za pomocą funkcji gensub
z GNU awk, ponieważ:
$ 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
Można go również użyć do zamiany grupy pól z podaną liczbą 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 !
Oczywiście w takim przypadku OFS służy do oddzielenia obu części linii, a końcowa biała przestrzeń pól jest nadal drukowana.
UWAGA: [FS]*
służy do dopuszczenia spacji wiodących w linii wejściowej.
grep | awk
Nawiasem mówiąc , jest to antypattern - chceszawk '/!/ { print $2 }'