オプション1
awkの一部のバージョンで動作するソリューションがあります。
awk '{ $(NF+1)=$1;$1="";$0=$0;} NF=NF ' infile.txt
説明:
$(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.
結果:
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN
ただし、それは古いバージョンのawkでは失敗する可能性があります。
オプション2
awk '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
あれは:
awk '{ # call awk.
$(NF+1)=$1; # Add one trailing field.
$1=""; # Erase first field.
sub(OFS,""); # remove leading OFS.
}1' # print the line.
消去する必要があるのはFSではなく、OFSであることに注意してください。このフィールドは、フィールド$ 1が割り当てられると再計算されます。これにより、FSのすべての実行が1つのOFSに変更されます。
しかし、OFSを変更することで明確に示されているように、そのオプションでもいくつかの区切り文字で失敗します。
awk -v OFS=';' '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
その行は出力します:
United;Arab;Emirates;AE
Antigua;&;Barbuda;AG
Netherlands;Antilles;AN
American;Samoa;AS
Bosnia;and;Herzegovina;BA
Burkina;Faso;BF
Brunei;Darussalam;BN
これは、FSの実行が1つのOFSに変更されていることを示しています。
これを回避する唯一の方法は、フィールドの再計算を回避することです。
再計算を回避できる1つの関数はsubです。
最初のフィールドをキャプチャし、subを使用して$ 0から削除し、両方を再印刷できます。
オプション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
FS、OFSを変更したり、区切り文字を追加したりしても機能します。
入力ファイルが次のように変更された場合:
AE..United....Arab....Emirates
AG..Antigua....&...Barbuda
AN..Netherlands...Antilles
AS..American...Samoa
BA..Bosnia...and...Herzegovina
BF..Burkina...Faso
BN..Brunei...Darussalam
そして、コマンドは次のように変わります。
awk -vFS='.' -vOFS=';' '{a=$1;sub("[^"FS"]+["FS"]+",""); print $0,a;}' infile.txt
出力は(まだデリミタを保持)になります。
United....Arab....Emirates;AE
Antigua....&...Barbuda;AG
Netherlands...Antilles;AN
American...Samoa;AS
Bosnia...and...Herzegovina;BA
Burkina...Faso;BF
Brunei...Darussalam;BN
コマンドはいくつかのフィールドに拡張できますが、最新のawksと--re-intervalオプションがアクティブな場合のみです。元のファイルに対するこのコマンド:
awk -vn=2 '{a=$1;b=$2;sub("([^"FS"]+["FS"]+){"n"}","");print $0,a,b;}' infile.txt
これを出力します:
Arab Emirates AE United
& Barbuda AG Antigua
Antilles AN Netherlands
Samoa AS American
and Herzegovina BA Bosnia
Faso BF Burkina
Darussalam BN Brunei