Linux/Unix에서 데이터 추출

Linux/Unix에서 데이터 추출

입력 데이터가 있고 awk/grep/sed를 사용하여 값을 구문 분석하고 추출하고 싶습니다.

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 28 29 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 29 30 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 10 11 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 11 12 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

기본적으로 "from="과 "fromid", "to="와 "toid="에서 다른 값을 가져오고 싶습니다. 출력이 어떻게 되어야 하는지 아래에서 볼 수 있습니다.

원하는 출력. "from="과 "to="에서 한 줄씩 연결한 값이어야 합니다. from=ABCB11은 여러 번 나타나지만 한 번만 표시하기를 원하므로 "to="의 값은 출력에 한 번만 있어야 합니다.

fromid 형식이든 toid 형식이든 두 가지 모두에서 다른 값을 얻은 후 모든 행이 fromid를 갖기를 원합니다. 출력 형식은 다음 출력에서 ​​설명할 수 있습니다.

ABCB11 = fromid=4,from=ABCB11
ABCC8 = fromid=5,from=ABCC8
ACE = fromid=11,from=ACE
CHRM1 = fromid=114,from=CHRM1
CHRM2 = fromid=115,from=CHRM2
DRD2 = fromid=158,from=DRD2
EGF = fromid=164,from=EGF
ADRA1A = fromid=21,from=ADRA1A
ADRA1B = fromid=22,from=ADRA1B
ADRA1D = fromid=23,from=ADRA1D

위와 똑같은 출력을 원하지만 다음과 같은 새 입력 파일이 있습니다.

ABCB11  4   ACE 11
ABCB11  4   CHRM1   114
ABCB11  4   CHRM2   115
ABCB11  4   DRD2    158
ABCB11  4   EGF 164
ABCC8   5   ACE 11
ABCC8   5   ADRA1A  21
ABCC8   5   ADRA1B  22
ABCC8   5   ADRA1D  23
ABCC8   5   CHRM1   114

모든 독특한 유전자를 얻고 결과물을 만들어 보세요.

답변1

awk를 사용할 수 있습니다.연관 배열고유성을 주장하는 필드별로 색인을 생성합니다(예: to=필드의 고유 값( $6쉼표로 구분된 필드)).

$ awk -F, '{split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;} END{for (id in arr) print arr[id]}' data.txt
EGF = toid=164,to=EGF
ADRA1A = toid=21,to=ADRA1A
ACE = toid=11,to=ACE
ADRA1B = toid=22,to=ADRA1B
ADRA1D = toid=23,to=ADRA1D
DRD2 = toid=158,to=DRD2
CHRM1 = toid=114,to=CHRM1
CHRM2 = toid=115,to=CHRM2

고유 항목의 표현식 fromid은 동일하지만 필드 및 는 및 로 $6대체됩니다 .$7$2$3

$ awk -F, '{split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;} END{for (id in arr) print arr[id]}' data.txt
ABCC8 = fromid=5,from=ABCC8
ABCB11 = fromid=4,from=ABCB11


toid출력에 및 데이터가 모두 포함되도록 하려면 fromid표현식을 결합할 수 있습니다.

awk -F, '{
split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;
split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;
} END{for (id in arr) print arr[id]}' data.txt

아마도 레이블을 변경하는 가장 자연스러운 방법 (즉 toid, 행에서 왔 더라도 테이블의 모든 필드에 레이블을 지정하는 것 )은 출력을 다음을 통해 전달하는 것입니다.fromidsed

$ awk -F, '{
split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;
split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;
} END{for (id in arr) print arr[id]}' data.txt | sed 's/from/to/g'
ABCC8 = toid=5,to=ABCC8
EGF = toid=164,to=EGF
ADRA1A = toid=21,to=ADRA1A
ACE = toid=11,to=ACE
ABCB11 = toid=4,to=ABCB11
ADRA1B = toid=22,to=ADRA1B
ADRA1D = toid=23,to=ADRA1D
DRD2 = toid=158,to=DRD2
CHRM1 = toid=114,to=CHRM1
CHRM2 = toid=115,to=CHRM2

fromid <--> toid내부적으로 교체를 수행 할 수도 있지만 awk이 접근 방식이 의도를 더 명확하게 한다고 생각합니다. 그런 다음 sed최종 표현식을 반대로 변경하여 다른 테이블을 만듭니다 sed 's/to/from/g'.

답변2

이름이 "filename.txt"라는 파일에 있다고 가정하면 첫 번째 테이블에 대해 다음을 시도할 수 있습니다.

cat filename.txt | awk -F "," '{ print $2 " = " $7 "," $6}' sed -r 's/^.{5}//'

두 번째 테이블의 경우:

cat filename.txt | awk -F "," '{ print $2 " = " $3 "," $6}' sed -r 's/^.{5}//'

행운을 빌어요!

편집: 두 번째 테이블의 경우:

cat filename.txt | awk -F "," '{ print $2 " = " $7 "," $6}' sed -r 's/^.{5}//' |

편집 2:

cat filename.txt | awk -F "," '{ print $2 " = " $7 "," $6}' sed 's/^.....//' |

이것은 5점입니다.

관련 정보