Pilihan 1
Ada solusi yang berfungsi dengan beberapa versi awk:
awk '{ $(NF+1)=$1;$1="";$0=$0;} NF=NF ' infile.txt
Penjelasan:
$(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.
Hasil:
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN
Namun itu mungkin gagal dengan versi awk yang lebih lama.
pilihan 2
awk '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Itu adalah:
awk '{ # call awk.
$(NF+1)=$1; # Add one trailing field.
$1=""; # Erase first field.
sub(OFS,""); # remove leading OFS.
}1' # print the line.
Perhatikan bahwa yang perlu dihapus adalah OFS, bukan FS. Garis akan dihitung ulang saat bidang $ 1 ditentukan. Itu mengubah semua proses FS menjadi salah satu OFS.
Tetapi bahkan opsi itu masih gagal dengan beberapa pembatas, seperti yang ditunjukkan secara jelas dengan mengubah OFS:
awk -v OFS=';' '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Baris itu akan menampilkan:
United;Arab;Emirates;AE
Antigua;&;Barbuda;AG
Netherlands;Antilles;AN
American;Samoa;AS
Bosnia;and;Herzegovina;BA
Burkina;Faso;BF
Brunei;Darussalam;BN
Itu menunjukkan bahwa run dari FS sedang diubah menjadi salah satu OFS.
Satu-satunya cara untuk menghindarinya adalah dengan menghindari penghitungan ulang bidang.
Salah satu fungsi yang dapat menghindari penghitungan ulang adalah sub.
Bidang pertama dapat diambil gambarnya, lalu dihapus dari $ 0 dengan sub, dan kemudian keduanya dicetak ulang.
Pilihan 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
Bahkan jika kita mengubah FS, OFS dan / atau menambahkan lebih banyak pembatas, itu berhasil.
Jika file input diubah menjadi:
AE..United....Arab....Emirates
AG..Antigua....&...Barbuda
AN..Netherlands...Antilles
AS..American...Samoa
BA..Bosnia...and...Herzegovina
BF..Burkina...Faso
BN..Brunei...Darussalam
Dan perintah berubah menjadi:
awk -vFS='.' -vOFS=';' '{a=$1;sub("[^"FS"]+["FS"]+",""); print $0,a;}' infile.txt
Outputnya adalah (masih mempertahankan pembatas):
United....Arab....Emirates;AE
Antigua....&...Barbuda;AG
Netherlands...Antilles;AN
American...Samoa;AS
Bosnia...and...Herzegovina;BA
Burkina...Faso;BF
Brunei...Darussalam;BN
Perintah dapat diperluas ke beberapa bidang, tetapi hanya dengan awks modern dan dengan opsi --re-interval active. Perintah ini pada file asli:
awk -vn=2 '{a=$1;b=$2;sub("([^"FS"]+["FS"]+){"n"}","");print $0,a,b;}' infile.txt
Akan menampilkan ini:
Arab Emirates AE United
& Barbuda AG Antigua
Antilles AN Netherlands
Samoa AS American
and Herzegovina BA Bosnia
Faso BF Burkina
Darussalam BN Brunei