입력 데이터가 있고 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
, 행에서 왔 더라도 테이블의 모든 필드에 레이블을 지정하는 것 )은 출력을 다음을 통해 전달하는 것입니다.fromid
sed
$ 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점입니다.