흥미로운 awk 문제 [닫기]

흥미로운 awk 문제 [닫기]

스크립트는 문자로 시작하는 코드를 제거하는 것 같습니다. P3420을 3420으로 바꾸면 스크립트가 예상대로 작동합니다. 무슨 일이 일어났는지 몰라

입력하다:

99443 - PHYS 전화 E/M 21~30분,,,,306,,,,

2341장, 게바흐, 배트맨, 2005년 1월 12일, 2005년 1월 10일,, 230.04, 100.00, 0.00,

3678장, 데스테파, 플래시, 2005년 1월 27일, 2005년 2월 2일,, 230.04, 100.00, 130.04,

99443 - PHYS 전화 E/M 21-30분 합계:,,,,306,,,,

P3420 B12주사 - B12주사,,,,15,,,,

3437장, Godot,09/04/2002,09/12/2002,,10.00,10.00,0.00,

3513 화

스크립트:

while read line
do
    # Debugging:
    if [ -z "$(echo "$line" | awk -F"," '{ print $3 }')" ]
    then
            #echo "$line"
            #if [ echo "$line" | grep '-' ]
            #then
                   var=$(echo "$line" | grep '-' | cut -d" " -f1)
                    echo $var
    fi

    if [ -n "$(echo "$line" | awk -F"," '{ print $3 }')" ]

    then
            echo "$line" | awk -F"," '{ $6='$var';print }' >> testingfile.txt


    fi
 done < $1

산출:

2341 게바 배트맨2005/12/01 2005/13/0199443230.04 100.00 0.00

3678 데스테파 플래시 2005년 1월 27일 2005년 2월 4일99443230.04 100.00 130.04

3437 챕 고든 2002년 9월 4일 2002년 9월 13일 10.00 10.00 0.00

3513 장 사조아하10/08/2002 10/08/2002 10.00 0.00 10.00

답변1

우와! 이 스크립트가 무엇을 하려는지 추측해 봅시다.

외부 while read루프는 파일을 한 번에 한 줄씩 읽고 \.

첫 번째 테스트에서는 쉼표로 구분된 세 번째 필드가 비어 있는지 확인하고, 비어 있으면 비어 있거나( var줄에 문자가 없는 경우) 첫 번째 공백 앞의 문자로 설정됩니다. -그런 다음 var를 인쇄하십시오.

두 번째 테스트에서는 쉼표로 구분된 세 번째 필드가 비어 있지 않은지 확인합니다. 을 사용하는 대신 다시 테스트하는 이유를 잘 모르겠습니다 else. 쉼표로 구분된 여섯 번째 필드가 값으로 설정되고 $var해당 행을 인쇄합니다.

따라서 행이 첫 번째 테스트에 도달하고 로 시작하면 P3420 B12var가 로 설정됩니다 P3420. 두 번째 awk 명령은 다음과 같습니다.

awk '-F,' '{$6=P3420;print}'

그리고 P3420이라는 변수가 없으므로 기본값은 빈 문자열입니다. P삭제한 다음 $6=3420정수를 할당 하면 모든 것이 정상입니다. 따라서 문제의 근본 원인은 인용 부족입니다. 명령은 다음과 같아야합니다

awk '-F,' '{$6="'$var'";print}'

한 줄에 최소 4개의 프로세스를 실행하는 것은 꽤 비쌉니다! 유닉스 프로세스는 저렴하지만 그렇게 저렴하지는 않습니다! 전체 파일은 awk 프로세스로 처리할 수 있습니다.

출력에서 쉼표를 유지하려면 BEGIN 블록에서 OFS에 할당을 추가하세요.

awk -F',' 'BEGIN { OFS="," }
           $3!="" { $6=zone; print }
           $3=="" { split($1,a,/ /) ; zone=a[1] }' $1

관련 정보