Більшість рішень з awk залишають простір. Варіанти тут уникають цієї проблеми.
Варіант 1
Просте вирізання (працює лише з окремими роздільниками):
command | cut -d' ' -f3-
Варіант 2
Примушуючи повторний виклик awk іноді видаляйте доданий провідний простір (OFS), залишений, видаляючи перші поля (працює з деякими версіями awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Варіант 3
Друк кожного поля, відформатованого за допомогою printf
, дасть більше контролю:
$ 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
Однак усі попередні відповіді змінюють всі повторювані ФС між полями на OFS. Давайте побудуємо пару варіантів, які цього не роблять.
Варіант 4 (рекомендується)
Петля з підпунктом для видалення полів і роздільників спереду.
І використовувати значення FS замість місця (що можна змінити).
Більш портативний і не викликає зміну FS на OFS:
ПРИМІТКА. Це ^[FS]*
прийняття вводу з провідними пробілами.
$ 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
Варіант 5
Цілком можливо створити рішення, яке не додасть додаткового (провідного чи трейлінг) пробілу, а також зберегти існуючі пробіли, використовуючи функцію gensub
GNU awk, як це:
$ 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
Він також може бути використаний для заміни групи полів з урахуванням кількості 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 !
Звичайно, в такому випадку OFS використовується для розділення обох частин рядка, а пробіл білого поля полів все ще надрукований.
ПРИМІТКА: [FS]*
використовується для дозволу провідних пробілів у рядку введення.
grep | awk
є в антипаттерн - ви хочетеawk '/!/ { print $2 }'