옵션 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 실행이 하나의 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로 변경되고 있음을 나타냅니다.
이를 피하는 유일한 방법은 필드 재 계산을 피하는 것입니다.
재 계산을 피할 수있는 한 가지 기능은 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