AWK - 범위에서 SN을 생성하고 이를 레코드에 추가합니다.

AWK - 범위에서 SN을 생성하고 이를 레코드에 추가합니다.

쉼표로 구분된 다음 입력 파일을 고려하세요.

1,13/06/17,01,03,D151
2,25/06/17,04,06,D154

각 레코드의 3rd및 필드를 사용하여 4thSN이 속한 레코드의 다른 필드와 동일한 일련 번호를 생성해야 합니다.

첫 번째 기록 (03 - 01 = 2+1)은 바로 이 신기록

레코드 2 (06 - 04 = 2+1)이 레코드의 새 레코드 수

산출:

1,13/06/17,01,03,D151
1,13/06/17,01,03,D151,1
1,13/06/17,01,03,D151,2
1,13/06/17,01,03,D151,3
2,25/06/17,04,06,D154
2,25/06/17,04,06,D154,4
2,25/06/17,04,06,D154,5
2,25/06/17,04,06,D154,6

SN은 I를 사용하여 간단히 생성할 수 있지만 for이를 원본 레코드에 연결하는 것이 여기서 문제입니다.

답변1

그것은 다음과 같습니다:

awk -F, '{print; for (i = 0+$3; i <= $4; i++) print $0 FS i}'

답변2

while IFS= read -r l; do
   printf '%s\n' "$l" | tee log
   for i in $(seq $(cut -d, -f3,4 log | tr , '\n')); do
     printf '%s,%s\n' "$l" "$i"
   done
done < input.csv

perl -F, -pe 's|(.*)\K|join $/, $,, map "$1,$_", 0+$F[2]..$F[3]|ex'  input.csv

산출:

1,13/06/17,01,03,D151
1,13/06/17,01,03,D151,1
1,13/06/17,01,03,D151,2
1,13/06/17,01,03,D151,3
2,25/06/17,04,06,D154
2,25/06/17,04,06,D154,4
2,25/06/17,04,06,D154,5
2,25/06/17,04,06,D154,6

설명하다

  1. 현재 행은 에 저장됩니다 $1. 현재 행은 수정자가 유효 하지 않으면 개행 문자와 일치하지 않으므로 \n$1에 저장되지 않습니다../s
  2. $F[2]..$F[3]=> 왼쪽에서 시작하여 오른쪽으로 끝나는 일련의 숫자를 생성합니다. 단계 크기는 1입니다. 이 0+아티팩트는 생성될 선행 0을 제거할 수 있습니다.
  3. map현재 행과 쉼표로 구분된 정수를 결합하여 적절한 작업이 수행됩니다.
  4. 3단계에서 생성된 모든 문자열은 $/기본적 으로 RS개행 문자로 연결됩니다.

관련 정보