1부터 6k까지의 정수 목록과 해당 범위의 각 정수에 할당하려는 세 번째 값이 포함된 범위(시작/중지) 목록이 있습니다. 범위 목록은 다음과 유사할 수 있지만 실제로는 모든 정수를 확인하기 위해 파일당 수백 개의 고유 범위가 있습니다.
5277 5305 72
5306 5331 50
5332 5361 57
5368 5389 55
내가 원하는 것은 범위 테이블의 세 번째 열에 있는 정수와 값을 인쇄하거나 어떤 범위에도 속하지 않는 정수에 대해 "0"을 인쇄하는 것입니다.
1 0
2 0
3 0
...
5277 72
5278 72
5279 72
...
5305 72
5306 50
5307 50
...
6000 0
예상되는 결과를 얻는 방법에 대한 아이디어가 있습니까? 1-6000 사이의 정수에 대해 "for" 루프를 작성하고 "if" 파일을 삽입하여 각 범위의 각 정수를 확인하려고 합니다. 하지만 단지 이를 변경하기 위해 수백 개의 개별 "if" 문을 작성하고 싶지는 않습니다. 다음은 데이터 세트입니다. 어쩌면 MySQL에서 범위 테이블을 생성하고 그 테이블에 대해 6000개의 값을 각각 확인하고 결과를 인쇄하면 될 수도 있겠지만, 저는 MySQL에 익숙하지 않아서 알아내는 데 더 오랜 시간이 걸릴 것입니다.
답변1
이것은 약간 복잡하지만 적어도 SQL을 사용하지 않아도 됩니다. "range"라는 파일의 샘플 범위를 사용합니다.
seq 6000 > integers
awk '{print $1","$2"{s/\\(.*\\)/\\1 "$3"/; t\n}" } END { print "s/\\(.*\\)/\\1 0/" }' range > range.sed
sed -f range.sed integers > integers.output
그러면 숫자 1..6000의 정수 파일이 생성되고 awk를 사용하여 범위 파일을 일련의 sed
명령으로 변환한 다음 모든 명령을 sed 스크립트 파일(range.sed)로 리디렉션합니다. 그런 다음 이 sed 스크립트 파일을 사용하여 정수 입력에 대해 sed를 호출하고 이를 출력 파일로 리디렉션합니다.
awk 스크립트는 두 가지 기본 작업을 수행합니다.
두 개의 명령 블록을 사용하여 "시작, 중지" 범위를 인쇄합니다(범위 파일의 첫 번째 및 두 번째 필드 사용).
ㅏ. sed 검색을 인쇄하고 "anything on line" 명령을 "anything before"와 범위 파일의 세 번째 열로 바꿉니다.
b. 교체에 성공하면 sed 스크립트 끝으로 분기합니다(따라서 sed 스크립트의 마지막 부분을 우회함).
sed 스크립트의 마지막 명령으로(모든 범위 입력이 끝난 후) sed 검색 및 바꾸기 명령을 인쇄하여 해당 줄의 모든 값을 해당 값 뒤에 0으로 바꿉니다.
이는 많은 하드코딩된 논리를 업데이트하지 않고도 필요에 따라 범위 및/또는 정수 파일을 업데이트할 수 있는 상당한 유연성을 제공합니다.