쉼표로 구분된 다음 입력 파일을 고려하세요.
1,13/06/17,01,03,D151
2,25/06/17,04,06,D154
각 레코드의 3rd
및 필드를 사용하여 4th
SN이 속한 레코드의 다른 필드와 동일한 일련 번호를 생성해야 합니다.
첫 번째 기록 (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
. 현재 행은 수정자가 유효 하지 않으면 개행 문자와 일치하지 않으므로\n
$1에 저장되지 않습니다..
/s
$F[2]..$F[3]
=> 왼쪽에서 시작하여 오른쪽으로 끝나는 일련의 숫자를 생성합니다. 단계 크기는 1입니다. 이0+
아티팩트는 생성될 선행 0을 제거할 수 있습니다.map
현재 행과 쉼표로 구분된 정수를 결합하여 적절한 작업이 수행됩니다.- 3단계에서 생성된 모든 문자열은
$/
기본적 으로RS
개행 문자로 연결됩니다.