विकल्प 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
हालाँकि यह पुराने संस्करणों के साथ विफल हो सकता है।
विकल्प 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.
ध्यान दें कि जिसे मिटाने की जरूरत है वह ओएफएस नहीं बल्कि ओएफएस है। जब फ़ील्ड $ 1 असाइन किया जाता है, तो रेखा फिर से परिकलित हो जाती है। यह FS के सभी रन को एक 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
यह पता चलता है कि एफएस के रन को ओएफएस में बदल दिया जा रहा है।
इससे बचने का एकमात्र तरीका क्षेत्र फिर से गणना से बचना है।
एक फ़ंक्शन जो फिर से कैल्क से बच सकता है वह उप है।
पहले क्षेत्र पर कब्जा किया जा सकता है, फिर उप के साथ $ 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
यहां तक कि अगर हम एफएस, ओएफएस और / या अधिक सीमांकक को बदलते हैं, तो यह काम करता है।
यदि इनपुट फ़ाइल को बदल दिया जाता है:
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