선을 반복하여 독특하게 만드시겠습니까?

선을 반복하여 독특하게 만드시겠습니까?

다음과 같은 텍스트 줄 구조가 있습니다.

3923 001    L05 LV,L05 RM
3923 002    L12 RA,L12 LA
3923 003    I06 ALL
3923 004    G04 RV,Z09 ALL

하지만 나에게는 이것이 필요하다:

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL
3923 004    G04 RV
3923 004    Z09 ALL

정규식을 사용하여 이를 달성할 수 있습니까?

기본적으로 각 줄에 ","가 포함된 횟수만큼 복사한 다음 10번째 문자부터 시작하여 고유하게 만들어야 합니다. 첫 번째 부분을 수행할 수 있다면 각 줄의 복사본 수 x 숫자만 사용하면 됩니다. 나머지는 수동으로 정리할 수 있습니다.

답변1

예제의 형식을 고려하면 초기 큰 공백 뒤에 있는 쉼표로 구분된 문자열의 개수에 관계없이 작동합니다(탭인 경우 두 번째 공백을 다음 s///으로 변경하세요).\t

sed ':;h;s/,.*//;p;x;s/    [^,]*,/    /;t;d' file

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL
3923 004    G04 RV
3923 004    Z09 ALL

라벨을 원한다면

탭 문자를 \t로 쓰고 싶다면 $'' 따옴표를 사용하여 Bash에 지정할 수 있습니다: sed $':;h;s/,.*//;p;x;s/\t[^ , ] *,/ /;t;d'. 아니면 그냥 리터럴 탭을 삽입하세요(Bash의 경우 문자 그대로 입력하려면 control-v를 입력해야 합니다). .

토비 스페이트

답변2

sed를 사용하는 것이 가능합니다. 아래 입력을 파이프하십시오.

| sed 's/\(^.\{12\}\)\([^,]\+\),\([^,]\+\)/\1\2\n\1\3/'

산출

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL
3923 004    G04 RV
3923 004    Z09 ALL

다음은 여러 개의 ","를 사용하여 입력을 처리하는 소스입니다.

탭이 없는 원시 입력의 경우 다음을 사용하세요.

| perl -ne '/,/ && do {chomp;s/^(.{12})(.+)/$1,$2/; @l = split(","); foreach $a (@l[1 .. $#l]) {print "$l[0]$a\n";};1;} || do {print;}'

입력에 탭 문자가 있으면 다음을 사용하십시오.

| perl -ne '/,/ && do{chomp; s/^([^\t]+\t)(.+)/$1,$2/; @l = split(","); foreach $a (@l[1 .. $#l]) {print "$l[0]$a\n";};1;} || do {print;}'

답변3

가능한 해결책 awk:

awk -F" " '{ x = $3 " " $4 " " $5; split(x, a, ","); for (i in a) { print $1, $2 "\t" a[i]; } }' file

출력은 다음과 같아야 합니다.

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL 
3923 004    G04 RV
3923 004    Z09 ALL

입력에 여러 개의 ,주석이 포함된 경우 3923 001 L05 LV,L05 RM,L09 AB다음을 시도해 볼 수 있습니다.

awk -F" " '{ x = $3; for (i = 4; i <= NF; i++) { x = x " " $i; } split(x, a, ","); for (i in a) { print $1, $2 "\t" a[i]; } }' file

답변4

awk필드 구분 기호를 사용하고 공백이나 쉼표로 설정할 수 있습니다 . 그런 다음 2개의 청크로 반복하여 두 청크로 첫 번째와 두 번째 필드를 인쇄합니다.

$ awk -v FS='(\\s+|,)' '{for (i=3; i<=NF; i+=2) print $1, $2, $i, $(i+1)}' file
3923 001 L05 LV
3923 001 L05 RM
3923 002 L12 RA
3923 002 L12 LA
3923 003 I06 ALL
3923 004 G04 RV
3923 004 Z09 ALL

관련 정보