[perl] awk로 첫 번째 필드를 제외한 모든 것을 인쇄

다음과 같은 파일이 있습니다.

AE  United Arab Emirates
AG  Antigua & Barbuda
AN  Netherlands Antilles
AS  American Samoa
BA  Bosnia and Herzegovina
BF  Burkina Faso
BN  Brunei Darussalam

그리고 순서를 뒤집고 $ 1을 제외한 모든 것을 먼저 인쇄 한 다음 $ 1을 인쇄합니다.

United Arab Emirates AE

“필드 1을 제외한 모든”트릭을 어떻게 할 수 있습니까?



답변

$1작업을 할당 하면 선행 공백이 남습니다.awk '{first = $1; $1 = ""; print $0, first; }'

열 수를 찾아 NF루프에서 사용할 수도 있습니다.


답변

$1=""Ben Jackson이 언급했듯이 공백을 남기므로 for루프를 사용하십시오 .

awk '{for (i=2; i<=NF; i++) print $i}' filename

따라서 문자열이 “one two three”이면 출력은 다음과 같습니다.


결과를 한 행에 표시하려면 다음과 같이 할 수 있습니다.

awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}' filename

이렇게하면 “둘 셋”이됩니다.


답변

다음 옵션 cut과 함께 명령을 사용하십시오 --complement.

$ echo a b c | cut -f 1 -d ' '
a
$ echo a b c | cut -f 1,2 -d ' '
a b
$ echo a b c | cut -f 1 -d ' ' --complement
b c


답변

아마도 가장 간결한 방법은 다음과 같습니다.

$ awk '{$(NF+1)=$1;$1=""}sub(FS,"")' infile
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

설명:

$(NF+1)=$1: “새”마지막 필드 생성기.

$1="": 원래 첫 번째 필드를 null로 설정

sub(FS,""): 처음 두 작업 후 {$(NF+1)=$1;$1=""}sub를 사용하여 첫 번째 필드 구분 기호를 제거합니다. 최종 인쇄는 암시 적입니다.


답변

awk '{sub($1 FS,"")}7' YourFile

첫 번째 필드와 구분 기호를 제거하고 결과를 인쇄합니다 ( 70이 아닌 값이므로 $ 0 인쇄).


답변

awk '{ saved = $1; $1 = ""; print substr($0, 2), saved }'

첫 번째 필드를로 설정하면 의 시작 부분에의 ""단일 복사본이 남습니다 . 단일 문자 (기본적으로 단일 공백) 라고 가정하면 . 그런 다음 저장된 사본을 추가합니다 .OFS$0OFSsubstr($0, 2)$1


답변

Perl 솔루션에 개방적이라면 …

perl -lane 'print join " ",@F[1..$#F,0]' file

한 공백의 입력 / 출력 구분 기호가있는 간단한 솔루션으로 다음을 생성합니다.

United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

다음은 약간 더 복잡합니다.

perl -F`  ` -lane 'print join "  ",@F[1..$#F,0]' file

입력 / 출력 구분 기호가 두 개의 공백이라고 가정합니다.

United Arab Emirates  AE
Antigua & Barbuda  AG
Netherlands Antilles  AN
American Samoa  AS
Bosnia and Herzegovina  BA
Burkina Faso  BF
Brunei Darussalam  BN

다음 명령 줄 옵션이 사용됩니다.

  • -n 입력 파일의 모든 줄을 반복하고 모든 줄을 자동으로 인쇄하지 않습니다.

  • -l 처리하기 전에 줄 바꿈을 제거하고 나중에 다시 추가합니다.

  • -a자동 분할 모드 – 입력 라인을 @F 배열로 분할합니다. 공백으로 분할하는 기본값

  • -F autosplit 수정 자,이 예에서는 ”(두 공백)로 분할합니다.

  • -e 다음 perl 코드를 실행하십시오.

@F는 각 줄에있는 단어의 배열이며, 0
$#F으로 시작하는 인덱스 는 단어의 수 @F
@F[1..$#F]입니다. 요소 1부터 마지막 ​​요소까지
@F[1..$#F,0]의 배열 조각입니다. 요소 1부터 마지막 ​​요소와 요소 0을 더한 배열 조각입니다.