Opcje od 1 do 3 mają problemy z wieloma białymi znakami (ale są proste). Z tego powodu opracowano opcje 4 i 5, które bez problemu przetwarzają wiele białych znaków. Oczywiście, jeśli opcje 4 lub 5 są używane z n=0
obiema, zachowa wszelkie wiodące białe spacje, co n=0
oznacza brak podziału.
opcja 1
Proste rozwiązanie cięcia (działa z pojedynczymi ogranicznikami):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
Opcja 2
Wymuszenie ponownego obliczenia awk czasami rozwiązuje problem (działa z niektórymi wersjami awk) dodanych spacji wiodących:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Opcja 3
Wydrukowanie każdego pola sformatowanego za pomocą printf
da większą kontrolę:
$ 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
Jednak wszystkie poprzednie odpowiedzi zmieniają wszystkie FS między polami na OFS. Zbudujmy kilka rozwiązań tego problemu.
Opcja 4
Pętla z sub do usuwania pól i ograniczników jest bardziej przenośna i nie powoduje zmiany FS na 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
UWAGA: "^ [" FS "] *" ma akceptować dane wejściowe ze spacjami wiodącymi.
Opcja 5
Całkiem możliwe jest zbudowanie rozwiązania, które nie dodaje dodatkowych początkowych ani końcowych białych znaków i zachowuje istniejące białe znaki przy użyciu funkcji gensub
z GNU awk, jak to:
$ 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
Można go również użyć do zamiany listy pól z liczbą 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 !
Oczywiście w takim przypadku OFS jest używany do oddzielenia obu części wiersza, a końcowe białe znaki pól są nadal drukowane.
Uwaga 1: ["FS"]*
służy do dopuszczania spacji wiodących w wierszu wejściowym.
cut -f3-
?