숫자 범위를 텍스트 파일의 전체 연속 숫자 목록으로 변환합니다.

숫자 범위를 텍스트 파일의 전체 연속 숫자 목록으로 변환합니다.

내 문제는 그 반대야이것.

내 입력 파일은 위치 및 일련번호 목록(예: 재고 목록)입니다. 일부 일련 번호는 범위(예: 11-17)로 나열되어 있으며 각 범위를 전체 일련 번호 목록(예: 11, 12, 13, 14, 15, 16, 17)으로 변환해야 합니다.

입력 형식은 다음과 같습니다.

Main Street # 12770-12786, 12980, 13012-13013, 13068, 13093, 13115, 13122, 13137-13156, 13548-13557, 13954-13969, 14471-14475, 14500-14508

Madison Ave # 14071-14074, 14105-14128, 14131-14140, 14603-14612

각 위치는 빈 줄로 구분됩니다. 각 위치는 이름으로 시작됩니다. 지금까지는 [a-zA-Z -]대문자와 소문자, 공백, 대시가 포함된 이름 만 보았습니다 . 이름은 새 줄의 0열에서 시작하고 그 뒤에 공백, 해시 값, 공백이 옵니다 #.

형식의 각 범위에 대해 nnnn-mmmm쉼표(및 공백)로 구분된 순차 값 목록을 생성해야 합니다. n1, n2, n3, n4, n5예를 들어 Madison Ave(위)의 인벤토리는 다음과 같이 나열되어야 합니다.

Madison Ave # 14071, 14072, 14073, 14074, 14105, 14106, 14107, etc.

입력은 텍스트 파일이고 출력은 텍스트 파일일 수 있습니다. Bash에서 처리하고 싶지만 Python을 사용할 수도 있을 것 같습니다.

나는 다음과 같은 솔루션의 가능한 부분을 알고 있습니다.

  1. grep을 사용하여 다음과 같이 정규식 패턴을 사용하여 범위를 찾습니다.

    grep -o -P '\d+-\d+'<input_file>
    
  2. 첫 번째 결과가 범위라고 가정합니다.4243-4263

    echo {4243-4263} | sed 's/-/../'
    
  3. 위 결과에 대해 다음과 같이 for 루프를 사용합니다.

    for i in {4243..4263}; do echo $i; done
    

이 모든 것을 하나의 솔루션으로 통합하는 방법을 모르겠습니다. 또한 이 문제를 해결하는 더 좋은 방법이 있을 수도 있다고 생각합니다.

답변1

펠은 어떻습니까?

  • 하나 이상의 숫자, 대시, 하나 이상의 숫자로 구성된 모든 시퀀스와 일치합니다.(\d+)-(\d+)
  • nnnn...mmmm괄호 안의 Perl 범위 표현식 으로 숫자의 캡처 시퀀스를 다시 작성합니다.
  • 결과를 Perl 표현식으로 평가하고, 배열을 생성하고, 연결하여 적절하게 구분된 문자열을 생성합니다.

그래서

$ perl -pe 's/(\d+)-(\d+)/join ", ", ($1..$2)/ge' input
Main Street # 12770, 12771, 12772, 12773, 12774, 12775, 12776, 12777, 12778, 12779, 12780, 12781, 12782, 12783, 12784, 12785, 12786, 12980, 13012, 13013, 13068, 13093, 13115, 13122, 13137, 13138, 13139, 13140, 13141, 13142, 13143, 13144, 13145, 13146, 13147, 13148, 13149, 13150, 13151, 13152, 13153, 13154, 13155, 13156, 13548, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13954, 13955, 13956, 13957, 13958, 13959, 13960, 13961, 13962, 13963, 13964, 13965, 13966, 13967, 13968, 13969, 14471, 14472, 14473, 14474, 14475, 14500, 14501, 14502, 14503, 14504, 14505, 14506, 14507, 14508

Madison Ave # 14071, 14072, 14073, 14074, 14105, 14106, 14107, 14108, 14109, 14110, 14111, 14112, 14113, 14114, 14115, 14116, 14117, 14118, 14119, 14120, 14121, 14122, 14123, 14124, 14125, 14126, 14127, 14128, 14131, 14132, 14133, 14134, 14135, 14136, 14137, 14138, 14139, 14140, 14603, 14604, 14605, 14606, 14607, 14608, 14609, 14610, 14611, 14612

관련 정보