fieldB에 지정된 값이 있는 CSV 파일에서 fieldA를 반복합니다.

fieldB에 지정된 값이 있는 CSV 파일에서 fieldA를 반복합니다.

각 레코드가 특정 값을 갖도록 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",""

예의 첫 번째 줄은 변경하고 싶지 않지만 여전히 출력에 포함합니다. 두 번째 줄 예를 들어, 마지막 필드를 에서 시작으로 변경하고 값까지 반복한 ""다음 에서 시작하려고 합니다.REP0001REP0100REP0001

다음은 필수 텍스트의 예입니다.


"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"

시도했지만 스크립팅 전문가 sedawk아닙니다. 내가 원하는 값이 있는 레코드를 찾아서 내가 원하는 값을 삽입하는 부분만 정리하면 됩니다. 하지만 반복 마법을 수행하는 방법을 모르겠습니다.


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'

관련 정보