ตัวเลือกที่ 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.
โปรดทราบว่าสิ่งที่ต้องลบคือ OFS ไม่ใช่ FS บรรทัดได้รับการคำนวณใหม่เมื่อฟิลด์ $ 1 เป็น asigned ที่เปลี่ยนการรัน FS ทั้งหมดเป็นหนึ่ง 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 กำลังเปลี่ยนเป็นหนึ่งใน OFS
วิธีเดียวที่จะหลีกเลี่ยงได้คือหลีกเลี่ยงการคำนวณฟิลด์ซ้ำ
ฟังก์ชันหนึ่งที่สามารถหลีกเลี่ยงการเกิดตะกรันซ้ำได้คือย่อย
สามารถจับฟิลด์แรกจากนั้นลบออกจาก $ 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