lựa chọn 1
Có một giải pháp hoạt động với một số phiên bản của awk:
awk '{ $(NF+1)=$1;$1="";$0=$0;} NF=NF ' infile.txt
Giải trình:
$(NF+1)=$1 # add a new field equal to field 1.
$1="" # erase the contents of field 1.
$0=$0;} NF=NF # force a re-calc of fields.
# and use NF to promote a print.
Kết quả:
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN
Tuy nhiên, điều đó có thể không thành công với các phiên bản cũ hơn của awk.
Lựa chọn 2
awk '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Đó là:
awk '{ # call awk.
$(NF+1)=$1; # Add one trailing field.
$1=""; # Erase first field.
sub(OFS,""); # remove leading OFS.
}1' # print the line.
Lưu ý rằng những gì cần được xóa là OFS, không phải FS. Dòng được tính lại khi trường $ 1 được đánh dấu. Điều đó thay đổi tất cả các lần chạy FS thành một OFS.
Nhưng ngay cả tùy chọn đó vẫn không thành công với một số dấu phân cách, như được thể hiện rõ ràng bằng cách thay đổi OFS:
awk -v OFS=';' '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Dòng đó sẽ xuất:
United;Arab;Emirates;AE
Antigua;&;Barbuda;AG
Netherlands;Antilles;AN
American;Samoa;AS
Bosnia;and;Herzegovina;BA
Burkina;Faso;BF
Brunei;Darussalam;BN
Điều đó tiết lộ rằng các lần chạy FS đang được thay đổi thành một OFS.
Cách duy nhất để tránh điều đó là tránh tính toán lại trường.
Một chức năng có thể tránh tái calc là phụ.
Trường đầu tiên có thể được chụp, sau đó xóa khỏi $ 0 với phụ, và sau đó cả hai được in lại.
Lựa chọn 3
awk '{ a=$1;sub("[^"FS"]+["FS"]+",""); print $0, a;}' infile.txt
a=$1 # capture first field.
sub( " # replace:
[^"FS"]+ # A run of non-FS
["FS"]+ # followed by a run of FS.
" , "" # for nothing.
) # Default to $0 (the whole line.
print $0, a # Print in reverse order, with OFS.
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN
Ngay cả khi chúng tôi thay đổi FS, OFS và / hoặc thêm nhiều dấu phân cách hơn, nó vẫn hoạt động.
Nếu tệp đầu vào được thay đổi thành:
AE..United....Arab....Emirates
AG..Antigua....&...Barbuda
AN..Netherlands...Antilles
AS..American...Samoa
BA..Bosnia...and...Herzegovina
BF..Burkina...Faso
BN..Brunei...Darussalam
Và lệnh thay đổi thành:
awk -vFS='.' -vOFS=';' '{a=$1;sub("[^"FS"]+["FS"]+",""); print $0,a;}' infile.txt
Đầu ra sẽ là (vẫn bảo toàn dấu phân cách):
United....Arab....Emirates;AE
Antigua....&...Barbuda;AG
Netherlands...Antilles;AN
American...Samoa;AS
Bosnia...and...Herzegovina;BA
Burkina...Faso;BF
Brunei...Darussalam;BN
Lệnh có thể được mở rộng đến một số trường, nhưng chỉ với các awk hiện đại và với tùy chọn --re-period đang hoạt động. Lệnh này trên tệp gốc:
awk -vn=2 '{a=$1;b=$2;sub("([^"FS"]+["FS"]+){"n"}","");print $0,a,b;}' infile.txt
Sẽ xuất cái này:
Arab Emirates AE United
& Barbuda AG Antigua
Antilles AN Netherlands
Samoa AS American
and Herzegovina BA Bosnia
Faso BF Burkina
Darussalam BN Brunei