정리가 필요한 보기 흉한 데이터 파일이 있습니다.
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
열을 잘 정렬하기 위해 출력 필드 구분 기호로 사용됩니다.