스크립트는 문자로 시작하는 코드를 제거하는 것 같습니다. 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 B12
var가 로 설정됩니다 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