Để phân tách một chuỗi thành một mảng trong awk
chúng ta sử dụng hàm split()
:
awk '{split($0, a, ":")}'
# ^^ ^ ^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Nếu không có dấu phân cách nào được đưa ra, nó sẽ sử dụng FS
, mặc định là khoảng trắng:
$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d
Chúng ta có thể đưa ra một dấu phân cách, ví dụ :
:
$ awk '{split($0, a, ":"); print a[2]}' <<< "a:b c:d e"
b c
Điều này tương đương với việc thiết lập nó thông qua FS
:
$ awk -F: '{split($0, a); print a[1]}' <<< "a:b c:d e"
b c
Trong gawk, bạn cũng có thể cung cấp dấu phân cách dưới dạng regrec:
$ awk '{split($0, a, ":*"); print a[2]}' <<< "a:::b c::d e" #note multiple :
b c
Và thậm chí xem những gì dấu phân cách trên mỗi bước bằng cách sử dụng tham số thứ tư của nó:
$ awk '{split($0, a, ":*", sep); print a[2]; print sep[1]}' <<< "a:::b c::d e"
b c
:::
Hãy trích dẫn trang man của GNU awk :
tách (chuỗi, mảng [, fieldsep [, seps]])
Chia chuỗi thành các phần được phân tách bằng fieldsep và lưu trữ các phần trong mảng và chuỗi phân cách trong mảng seps . Phần đầu tiên được lưu trữ array[1]
, phần thứ hai array[2]
và vv. Giá trị chuỗi của đối số thứ ba, fieldsep , là một biểu thức chính quy mô tả nơi phân tách chuỗi (nhiều như FS có thể là biểu thức chính quy mô tả nơi phân chia các bản ghi đầu vào). Nếu trường bị bỏ qua, giá trị của FS được sử dụng. split()
trả về số lượng phần tử được tạo. seps là một gawk
phần mở rộng, với seps[i]
chuỗi phân cách giữaarray[i]
và array[i+1]
. Nếu fieldsep là một không gian duy nhất, thì bất kỳ khoảng trắng hàng đầu nào cũng đi vào seps[0]
và bất kỳ khoảng trắng theo sau nào đi vào seps[n]
, trong đó n là giá trị trả về của split()
(tức là số phần tử trong mảng).
OFS
, hãy đặt dấu phẩy ở giữa chúng, làm choprint
chúng được xem như là các đối số riêng biệt.