각 레코드가 특정 값을 갖도록 CSV 파일을 처리하기 위해 gitbash에서 실행되는 스크립트를 설정하려고 했습니다. 마지막 필드는 빈()에서 ""
1에서 16까지 반복되는 값으로 변경되었습니다. 또한 업데이트된 값 앞에는 일부 텍스트가 옵니다.
CSV 파일에서 일치하는 각 레코드에 대해 필드는 와 같아야 하고 REP0001
로 끝나고 REP0100
다시 시작되어야 합니다.REP0001
다음은 텍스트를 입력하는 예입니다.
"00:30:00","01:00:00","10/14/2014","RETURN","PASADENA","TX","12:30:00","sedan","","","corporate","CO01353"
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal",""
예의 첫 번째 줄은 변경하고 싶지 않지만 여전히 출력에 포함합니다. 두 번째 줄 예를 들어, 마지막 필드를 에서 시작으로 변경하고 값까지 반복한 ""
다음 에서 시작하려고 합니다.REP0001
REP0100
REP0001
다음은 필수 텍스트의 예입니다.
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"
시도했지만 스크립팅 전문가 sed
는 awk
아닙니다. 내가 원하는 값이 있는 레코드를 찾아서 내가 원하는 값을 삽입하는 부분만 정리하면 됩니다. 하지만 반복 마법을 수행하는 방법을 모르겠습니다.
awk 'BEGIN{FS=",";OFS=","} $4 ~ /"RENT OUT"/ {$12="\042""REP0001""\042"}1' Rentals.csv > output
누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 파일 자체의 길이는 약 2000줄입니다.
답변1
나는 이것이 당신이 원하는 것을 한다고 믿습니다:
$ awk 'BEGIN{FS=",";OFS=","} $4 ~ /"RENT OUT"/ {NF--;printf $0; x=x%100;x++; printf ",\"REP%04i\"\n",x;next} 1' rentals.csv
"00:30:00","01:00:00","10/14/2014","RETURN","PASADENA","TX","12:30:00","sedan","","","corporate","CO01353"
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"
변경된 유일한 부분은 다음 명령입니다.
$4 ~ /"RENT OUT"/ {NF--;printf $0; x=x%100;x++; printf ",\"REP%04i\"\n",x;next}
한 번에 하나의 새 작품을 가져옵니다.
NF--
그러면 행에서 마지막(빈) 필드가 제거됩니다.
`프린트 $0
그러면 행이 인쇄됩니다(이제 마지막 필드는 제외).
x=x%100;x++
카운터 모듈
x
로 100은 1씩 증가합니다. 이렇게 하면 카운터가 1에서 100까지 순환하고 다시 1로 돌아갑니다.printf ",\"REP%04i\"\n",x
그러면 카운터가 포함된 새로운 마지막 필드가 인쇄됩니다.
next
이 줄을 이미 인쇄했으므로
awk
나머지 명령을 건너뛰고next
해당 줄부터 시작하라는 메시지가 표시됩니다.
답변2
또 다른 (더 컴팩트한) 버전 sprintf
:
awk 'BEGIN{FS=OFS=","} $4 ~ /"RENT OUT"/ {$12=sprintf("\"REP%04i\"",++i);i=i%100}1'