awk를 사용하여 열 재정렬

awk를 사용하여 열 재정렬

다음을 사용하여 CSV 파일의 열 7을 끝으로 이동하려고 합니다.

awk -F '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}',OFS= "$file"

여기서 $file은 디렉터리의 .csv 파일입니다. 그러나 출력은

awk:                          ^ syntax error

이 오류를 해결하는 방법을 아는 사람이 있나요?

답변1

-F옵션에는 하나의 인수(필드 구분 기호)가 필요합니다 -F,.

스크립트의 끝은 (공백 문자)로 나머지 매개변수와 구분되어야 합니다 awk.

필드 구분 기호가 이고 ,이를 유지하고 열 수가 일정하고 11보다 작거나 같은 경우 다음을 시도하십시오.

awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"

필드 구분 기호가 세미콜론인 경우 아래와 같이 따옴표로 묶어 설정하는 것을 잊지 마세요.

awk -f';' '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=';' "$file"

답변2

더 짧은 해결책은

awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file

,+모든 버전에서 작동하는지 확실하지 않지만 적어도 GNU awk 및 호환 모드 awk에서도 작동합니다 .-c

설명하다:

  • $(NF+1)=$7: 먼저 줄 끝에 7번째 필드를 추가합니다(아마도 $12=$7이 경우).
  • $7="": 다음 단계에서는 7번째 필드가 제거됩니다(단, 주변 구분 기호는 남아 있음).
  • 구분 기호를 제거하려면 전체 레코드를 다시 정렬해야 합니다( 여러 개의 쉼표를 필드 구분 기호로 처리( 여기서는 한 번 이상 $0=$0수행됨 )). 또한 이전에 설정된 출력 필드 강제 재구축 라인을 사용 하도록 현재 레코드를 다시 정렬해야 합니다. 구분 기호(옵션으로 설정 )-F',+'+$1=$1-v OFS=,
  • 모든 셔플링이 완료되면 결과를 인쇄할 준비가 되었습니다.1

입력 예:

1,2,3,4,5,6,7,8,9,10,11

산출

1,2,3,4,5,6,8,9,10,11,7

답변3

를 사용하여 인쇄하는 경우 OFS=필드 사이에 구분 기호가 없으며 간단히 $7변수 의 값을 저장하고 $7빈 값으로 설정한 후 라인과 변수를 직접 인쇄할 수 있습니다. 모든 필드를 지정할 필요는 없습니다.

$ cat file
1,2,3,4,5,6,7,8
$ awk -F, -vOFS= '{k=$7; $7=""; print $0,k}' file 
12345687

답변4

다양한 awk변형(파일이 변수 안에 있다고 가정 $file)

  • 여기에서 모든 열을 반복하고, 필드 구분 기호(OFS)를 사용하여 인쇄하고, 행 끝에 레코드 종결자(ORS)를 인쇄할 수 있습니다.

    awk  -F',' -v OFS=,                                \
    '{for(i=1;i<=NF;i++) if (i!=7) printf "%s",$i OFS; \
    printf "%s",$7;printf ORS}' "$file"
    
  • 여기서는 정규식을 사용하고gensub()기능

    gawk -F',+' -v OFS=, '{$0=gensub(/\s*\S+/,"",7) OFS $7}1' "$file"
    

    죽이다7번째 필드를 입력하고 줄 끝에 인쇄합니다.

    • $0전체 기록입니다
    • $nn번째 기록 이다
    • NF현재 행의 필드 수입니다.
    • OFS출력 필드 구분 기호
    • ORS출력 레코드 종결자
    • 1true이것은 awk에게 알려주고 기본값( )을 인쇄하는 트릭입니다 $0.

고쳐 쓰다...

7 열 이후의 모든 열을 이동할 수 있다는 사실을 거의 잊어버렸습니다 .

awk  -F',' -v OFS=, '{tmp=$7; for(i=7;i<=NF;i++) $i=$(i+1); $NF=tmp}1 ' "$file"

관련 정보