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