Option 1
Es gibt eine Lösung, die mit einigen Versionen von awk funktioniert:
awk '{ $(NF+1)=$1;$1="";$0=$0;} NF=NF ' infile.txt
Erläuterung:
$(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.
Ergebnis:
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN
Dies kann jedoch bei älteren Versionen von awk fehlschlagen.
Option 2
awk '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Das ist:
awk '{ # call awk.
$(NF+1)=$1; # Add one trailing field.
$1=""; # Erase first field.
sub(OFS,""); # remove leading OFS.
}1' # print the line.
Beachten Sie, dass das OFS gelöscht werden muss, nicht das FS. Die Zeile wird neu berechnet, wenn das Feld $ 1 zugewiesen wird. Dadurch werden alle FS-Läufe in einen OFS geändert.
Aber selbst diese Option schlägt bei mehreren Trennzeichen immer noch fehl, wie die Änderung des OFS deutlich zeigt:
awk -v OFS=';' '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt
Diese Zeile gibt Folgendes aus:
United;Arab;Emirates;AE
Antigua;&;Barbuda;AG
Netherlands;Antilles;AN
American;Samoa;AS
Bosnia;and;Herzegovina;BA
Burkina;Faso;BF
Brunei;Darussalam;BN
Dies zeigt, dass FS-Läufe in einen OFS geändert werden.
Die einzige Möglichkeit, dies zu vermeiden, besteht darin, die Neuberechnung des Feldes zu vermeiden.
Eine Funktion, die eine Neuberechnung vermeiden kann, ist sub.
Das erste Feld konnte erfasst, dann mit sub von $ 0 entfernt und dann beide neu gedruckt werden.
Option 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
Selbst wenn wir den FS, den OFS ändern und / oder weitere Trennzeichen hinzufügen, funktioniert dies.
Wenn die Eingabedatei geändert wird in:
AE..United....Arab....Emirates
AG..Antigua....&...Barbuda
AN..Netherlands...Antilles
AS..American...Samoa
BA..Bosnia...and...Herzegovina
BF..Burkina...Faso
BN..Brunei...Darussalam
Und der Befehl ändert sich zu:
awk -vFS='.' -vOFS=';' '{a=$1;sub("[^"FS"]+["FS"]+",""); print $0,a;}' infile.txt
Die Ausgabe wird sein (wobei Trennzeichen erhalten bleiben):
United....Arab....Emirates;AE
Antigua....&...Barbuda;AG
Netherlands...Antilles;AN
American...Samoa;AS
Bosnia...and...Herzegovina;BA
Burkina...Faso;BF
Brunei...Darussalam;BN
Der Befehl kann auf mehrere Felder erweitert werden, jedoch nur mit modernen awks und mit aktivierter Option --re-interval. Dieser Befehl in der Originaldatei:
awk -vn=2 '{a=$1;b=$2;sub("([^"FS"]+["FS"]+){"n"}","");print $0,a,b;}' infile.txt
Wird dies ausgeben:
Arab Emirates AE United
& Barbuda AG Antigua
Antilles AN Netherlands
Samoa AS American
and Herzegovina BA Bosnia
Faso BF Burkina
Darussalam BN Brunei