Hầu hết các giải pháp với awk để lại một khoảng trống. Các tùy chọn ở đây tránh vấn đề đó.
lựa chọn 1
Một giải pháp cắt đơn giản (chỉ hoạt động với các dấu phân cách đơn):
command | cut -d' ' -f3-
Lựa chọn 2
Buộc một awk calc lại đôi khi loại bỏ không gian hàng đầu được thêm vào (OFS) bằng cách xóa các trường đầu tiên (hoạt động với một số phiên bản của awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Lựa chọn 3
In từng trường được định dạng printf
sẽ cung cấp thêm quyền kiểm soát:
$ 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
Tuy nhiên, tất cả các câu trả lời trước đó thay đổi tất cả FS lặp lại giữa các trường thành OFS. Hãy xây dựng một vài tùy chọn không làm điều đó.
Tùy chọn 4 (được khuyến nghị)
Một vòng lặp với phụ để loại bỏ các trường và dấu phân cách ở phía trước.
Và sử dụng giá trị của FS thay vì không gian (có thể thay đổi).
Dễ mang theo hơn và không kích hoạt thay đổi FS thành OFS:
LƯU Ý: Việc ^[FS]*
chấp nhận đầu vào có khoảng trắng ở đầu.
$ 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
Lựa chọn 5
Hoàn toàn có thể xây dựng một giải pháp không thêm khoảng trắng (dẫn hoặc theo dõi) và bảo toàn (các) khoảng trắng hiện có bằng cách sử dụng hàm gensub
từ GNU awk, như sau:
$ 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ó cũng có thể được sử dụng để trao đổi một nhóm các trường được tính 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 !
Tất nhiên, trong trường hợp như vậy, OFS được sử dụng để phân tách cả hai phần của dòng và khoảng trắng ở cuối của các trường vẫn được in.
LƯU Ý: [FS]*
được sử dụng để cho phép các không gian hàng đầu trong dòng đầu vào.
grep | awk
là một antipotype - bạn muốnawk '/!/ { print $2 }'