반복되는 부분을 하이픈으로 대체하여 숫자 목록을 쉽게 확장하는 방법은 무엇입니까?

반복되는 부분을 하이픈으로 대체하여 숫자 목록을 쉽게 확장하는 방법은 무엇입니까?

주목! 정규식과 예제 데이터를 변경했기 때문에 일부 답변이 틀릴 수도 있습니다! 이것이 나쁜 습관이라면 사과드립니다.

저는 grep(온라인 도구)을 사용하여 데이터 목록을 추출했습니다. 여기서 반복되는 부분은 때때로 하이픈(-o 플래그)으로 대체됩니다. 숫자는 항상 8자리입니다. 사용된 정규 표현식 뒤에는 8자리 숫자가 더 올 수 있습니다. [0-9]{8}(, -[0-9]*)*(, [0-9]{8})* 아래 데이터 예시:

33520470
33520850, -60, -70, -80, -90, 33630077
25453810
13815206, -07, -08, 60682651, 60709994
13340820
61040146, -55
60819060, -79
60819088

내가 원하는 출력은 다음과 같습니다.

33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088

grep으로 할 수 있나요? 그렇지 않다면 이 결과를 얻기 위해 유닉스나 다른 도구를 제안해 주실 수 있나요? 나는 sed 또는 awk를 생각하고 있습니다.

편집: 이 문제가 해결되었습니다. 편의상 주석을 주의 깊게 읽을 필요가 없도록 여기에 올바른 명령을 포함하겠습니다.

-F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 7){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'

답변1

나는 awk를 사용해 보았습니다.

cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2)) } }'

산출:

33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088

편집하다:

올바른 결과를 얻는 코드:

cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 3){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'

결과:

33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088

답변2

고쳐 쓰다전처리 단계를 사용하여 수정된 입력을 처리합니다.

이 답변의 나머지 부분에서는 데이터가 전처리되었다고 가정합니다.

grep -oE '[0-9]{8}(, -[0-9]+)*'

즉, 완벽한 솔루션에는 다음이 필요합니다.

grep -oE ... file | awk ...

BEGIN { FS = ", *" }

{
    print $1
    for (i = 2; i <= NF; ++i)
        print substr($1, 1, length($1) - length($i) + 1) substr($i, 2)
}

스크립트 awk는 한 줄을 읽고 첫 번째 쉼표로 구분된 필드를 인쇄합니다. 그런 다음 나머지 필드를 반복하고 첫 번째 필드를 출력하며, 나중에 -다른 필드에 문자를 삽입할 만큼 끝 부분의 문자를 잘라냅니다.

이 코드는 가변 길이 "접미사"를 허용합니다.

시험:

$ awk -f script.awk file
33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088

다른 예시:

$ cat file
1111
2222,-3,-4, -33,-44, -333,-444
$ awk -f script.awk file
1111
2222
2223
2224
2233
2244
2333
2444

"한 줄"로:

awk -F ', *' '{print $1; for(i=2;i<=NF;++i)print substr($1,1,length($1)-length($i)+1)substr($i,2)}' file

관련 정보