seçenek 1
Awk'nin bazı sürümleriyle çalışan bir çözüm var:
awk '{ $(NF+1)=$1;$1="";$0=$0;} NF=NF ' infile.txt
Açıklama:
$(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.
Sonuç:
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN
Ancak bu, awk'nin eski sürümlerinde başarısız olabilir.
seçenek 2
awk '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Yani:
awk '{ # call awk.
$(NF+1)=$1; # Add one trailing field.
$1=""; # Erase first field.
sub(OFS,""); # remove leading OFS.
}1' # print the line.
Silinmesi gereken şeyin FS değil OFS olduğunu unutmayın. $ 1 alanı atandığında satır yeniden hesaplanır. Bu, tüm FS çalıştırmalarını bir OFS'ye değiştirir.
Ancak bu seçenek bile, OFS'nin değiştirilmesiyle açıkça gösterildiği gibi, birkaç sınırlayıcıyla hala başarısız oluyor:
awk -v OFS=';' '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Bu satırın çıktısı:
United;Arab;Emirates;AE
Antigua;&;Barbuda;AG
Netherlands;Antilles;AN
American;Samoa;AS
Bosnia;and;Herzegovina;BA
Burkina;Faso;BF
Brunei;Darussalam;BN
Bu, FS çalıştırmalarının bir OFS olarak değiştirildiğini ortaya çıkarır.
Bundan kaçınmanın tek yolu, alanın yeniden hesaplanmasını önlemektir.
Yeniden hesaplamayı önleyebilecek bir işlev alttır.
İlk alan yakalanabilir, ardından $ 0'dan sub ile çıkarılabilir ve ardından her ikisi de yeniden yazdırılabilir.
3. Seçenek
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'yi değiştirsek ve / veya daha fazla sınırlayıcı eklesek bile işe yarıyor.
Girdi dosyası şu şekilde değiştirilirse:
AE..United....Arab....Emirates
AG..Antigua....&...Barbuda
AN..Netherlands...Antilles
AS..American...Samoa
BA..Bosnia...and...Herzegovina
BF..Burkina...Faso
BN..Brunei...Darussalam
Ve komut şu şekilde değişir:
awk -vFS='.' -vOFS=';' '{a=$1;sub("[^"FS"]+["FS"]+",""); print $0,a;}' infile.txt
Çıktı şu şekilde olacaktır (sınırlayıcılar hala korunmaktadır):
United....Arab....Emirates;AE
Antigua....&...Barbuda;AG
Netherlands...Antilles;AN
American...Samoa;AS
Bosnia...and...Herzegovina;BA
Burkina...Faso;BF
Brunei...Darussalam;BN
Komut birkaç alana genişletilebilir, ancak yalnızca modern awks ve --re-interval seçeneği etkinken. Orijinal dosyadaki şu komut:
awk -vn=2 '{a=$1;b=$2;sub("([^"FS"]+["FS"]+){"n"}","");print $0,a,b;}' infile.txt
Bunu çıkaracak:
Arab Emirates AE United
& Barbuda AG Antigua
Antilles AN Netherlands
Samoa AS American
and Herzegovina BA Bosnia
Faso BF Burkina
Darussalam BN Brunei