đáng tin cậy với GNU awk cho gensub() khi sử dụng FS mặc định:
$ gawk -v delNr=2 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john maketing executive
jack chief technical officer
jim developer
dela assistant risk management officer
Với các thiết bị khác, bạn cần sử dụng match() và substr() thay vì gensub(). Lưu ý rằng delNr biến trên nói với awk mà trường bạn muốn xóa:
$ gawk -v delNr=3 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john 32 executive
jack 41 technical officer
jim 27
dela 33 risk management officer
Đừng làm điều này:
awk '{sub($2 OFS, "")}1'
như cùng văn bản đó là trong $ 2 có thể là ở phần cuối của $ 1, và/hoặc $ 2 có thể chứa các metacharacters RE vì vậy có một cơ hội rất tốt là bạn sẽ loại bỏ chuỗi sai theo cách đó.
Đừng làm điều này:
awk '{$2=""}1' file
vì nó cho biết thêm một FS và sẽ nén tất cả các khoảng trắng liền kề khác giữa các trường thành một char trống duy nhất mỗi.
Đừng làm điều này:
awk '{$2="";sub(" "," ")}1' file
vì nó trách nhiệm thực hiện vấn đề không gian nén nêu trên và dựa vào một FS mã hóa cứng của một đơn trống (mặc định, tuy nhiên, như vậy có lẽ không đến nỗi tệ) nhưng quan trọng hơn nếu có không gian trước $ 1, nó sẽ loại bỏ một trong số đó thay vì không gian mà nó thêm vào giữa $ 1 và $ 2.
Điều cuối cùng đáng chú ý là trong các phiên bản gần đây của gawk có một hàm mới có tên patsplit() hoạt động như split() NHƯNG ngoài việc tạo ra một mảng các trường, nó cũng tạo ra một mảng các khoảng trắng giữa các trường. Điều đó có nghĩa là bạn có thể thao tác các trường và khoảng trắng giữa các mảng trong bảng, do đó bạn không phải lo lắng về việc awk biên dịch lại bản ghi bằng cách sử dụng OFS nếu bạn thao tác một trường. Sau đó, bạn chỉ cần in các trường bạn muốn từ các mảng. Xem patsplit() trong http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions để biết thêm thông tin.
Nguồn
2013-08-27 12:11:13
Một hack đơn giản là đặt $ 2 đến "", sau đó in $ 0 (tất cả các trường) - mặc dù điều đó sẽ cung cấp cho bạn thêm dấu phân tách cho trường trống. – mkfs
3 năm sau, bạn đã giúp tôi. Nhưng bạn nên thay đổi "
Koreth