awk 분할 및 조건부 인쇄

awk 분할 및 조건부 인쇄

정리가 필요한 보기 흉한 데이터 파일이 있습니다.

Date          User Name          Item Id     Title                                                                             Quantity        Price Total Amount
1/1/2015     name1             461064485   Description One Has Spaces                                                                  1     $899.99              $899.99
         Real Name 1                Real Address With Spaces                                                  Location, Real 55555                    555-555-5555

1/2/2015     name2 has spaces 461222501   Description still has spaces                                                                  1     $229.99              $229.99
         Real Name                 Real Address 2 w spaces                                                   Real Location2 55556                    555-555-5556

지금까지 가장 잘 작동합니다.

awk -F "  +" '/^[0-9]\/*[0-9]\// {print $1, $3, $5, $6, $7}' Table.txt > x.txt

그런데 사용자 이름이 너무 길고 프로젝트 ID와 한 칸만 차이가 나서 끊겼습니다. 이 경우 $2는 필수 $2+$3이 됩니다.

조건부 분할 및 인쇄를 시도했습니다.

awk -F "  +" '/^[0-9]*\/*[0-9]\// {if ( length ($2) >= 15 ) brokenfield=$2 split(brokenfield,subfields," "); print $1, subfields[-1], $4, $5, $6} {if (length ($2) < 15) print $1, $3, $5, $6, $7}' Table.txt > x.txt

작동하지만 모든 것을 처리하거나 두 번 처리합니다.

awk -F "  +" '/^[0-9]\/*[0-9]\// {if ( length ($2) >= 15 ) brokenfield=$2 split(brokenfield,subfields," ") print "$1, subfields[-1], $4, $5, $6"; else print "$1, $3, $5, $6, $7" }' Table.txt > x.txt

그러나 줄을 두 번 처리하거나 모든 줄을 처리하거나(검색 알고리즘은 날짜로 시작하는 줄만 처리해야 하기 때문에 이유는 확실하지 않음) 인쇄 또는 else 문에 대한 오류가 발생하지 않으면 구문을 올바르게 얻을 수 없습니다.

고정된 열 너비를 갖도록 printf로 업그레이드할 계획이지만 구문을 제대로 얻을 수 없습니다.

원하는 출력(바람직하게는 고정된 열 너비):

1/1/2015    461064485    1    $899.99    $899.99
1/2/2015    461222501    1    $229.99    $229.99 

답변1

나는 당신의 버전을 가져와서 몇 가지 수정을 했습니다:

awk -F "  +" -v'OFS=\t' '/^[0-9]+\/[0-9]+\//{ \
     if(length($2)>=15){ \
           brokenfield=$2; n=split(brokenfield,subfields," "); \
           print $1,subfields[n],$4,$5,$6 \
     } \
     else {print $1,$3,$5,$6,$7} \
}' file

산출:

1/1/2015    461064485   1   $899.99 $899.99
1/2/2015    461222501   1   $229.99 $229.99

몇 가지 참고사항:

  • {}조건문 주위에 중괄호를 넣는 것을 잊었습니다.
  • 음수 배열 인덱싱이 지원되지 않는다고 생각합니다 awk(적어도 내 것은 아님 gawk).
  • split배열 요소의 개수를 반환하므로 마지막 배열 요소의 인덱스로 사용할 수 있습니다( n위의 경우).
  • \t열을 잘 정렬하기 위해 출력 필드 구분 기호로 사용됩니다.

관련 정보