Giải pháp (hơi phức tạp) này, hơi giống với câu trả lời của Gilles ,
- không có khoảng trống ở đầu dòng
- xử lý chính xác trường hợp dòng đầu vào bắt đầu bằng khoảng trắng và
- bảo tồn khoảng trắng giữa các lĩnh vực.
awk -v word=alpha '
$2 == word {
i = index($0, $1) # Find $1 within $0 (the line).
if (i > 0) { # Sanity check; should always be true.
i = i + length($1) # Find space after $1.
temp = substr($0, i)
i = index(temp, $2) # Find $2 in remainder of line.
if (i > 0) { # Sanity check; should always be true.
print substr(temp, i)
}
}
}'
Tôi tin rằng các ý kiến nội tuyến giải thích nó khá tốt. Chúng tôi tìm thấy $1
vị trí của hàng trong dòng (hãy nhớ rằng, tôi rõ ràng không cho rằng đó là lúc bắt đầu). Sau đó, câu trả lời của à la Gilles , chúng tôi loại bỏ $1
(và khoảng trắng trước nó, nếu có) ra khỏi dòng. Sau đó tìm $2
vị trí của phần còn lại của dòng và loại bỏ khoảng trắng trước đó.
Đây là một chút tinh giản câu trả lời của Dennis Williamson .
awk -v word=alpha '$2==word { for (f=2; f<=NF; ++f) printf("%s%s", $f, (f==NF?ORS:OFS)) }'
Giống như câu trả lời của Dennis, nó sẽ tạo ra các lĩnh vực $2
, $3
, ..., $NF
(bỏ qua $1
) với tách mặc định. Dennis đã tiếp cận các phần trước $3
, trên, $NF
(nhưng không $2
) với dấu tách trường đầu ra mặc định. Tôi đã sử dụng cách tiếp cận sau $2
, trên $3
, $(NF-1)
(nhưng không $NF
) với OFS. Và, do $NF
được phân tách bằng dấu tách bản ghi đầu ra (ORS), chúng ta có thể sử dụng một ?:
toán tử không có thuật ngữ null và loại bỏ phần cuối cùng printf("\n")
.
$1
, giải pháp này sẽ loại bỏ khoảng trắng hàng đầu đó và để lại tất cả các trường (bao gồm$1
). Không có bất kỳ đề nghị nào trong câu hỏi điều đó có thể xảy ra.