Linux/Unix에서 데이터 구문 분석 및 조작

Linux/Unix에서 데이터 구문 분석 및 조작

이 게시물에서 정확히 동일한 결과를 얻고 싶습니다(Linux/Unix에서 데이터 추출위와 같지만 다음과 같은 새 입력 파일이 있습니다.

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

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

나는 두 행 모두에서 다른 값을 얻은 후 모든 행이 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

답변1

기둥이 4개 있다고 가정하면 이는 2단계 솔루션입니다.

awk 'NR == FNR {if (s[$1]++ == 0)
{printf "%s = fromid=%s, from=%s\n", $1, $2, $1}; next};
!s[$3]++{printf "%s = fromid=%s, from=%s\n", $3, $4, $3}' file file
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

답변2

출력 순서가 마음에 들지 않으면 다음을 수행하십시오.

$ awk '!($1 in a){a[$1] = $2}
       !($3 in a){a[$3] = $4}
       END {
           for(i in a) {
               print i" = fromid="a[i]",from="i
           }
       }' file
EGF = fromid=164,from=EGF
CHRM1 = fromid=114,from=CHRM1
CHRM2 = fromid=115,from=CHRM2
ACE = fromid=11,from=ACE
ADRA1A = fromid=21,from=ADRA1A
DRD2 = fromid=158,from=DRD2
ABCB11 = fromid=4,from=ABCB11
ADRA1B = fromid=22,from=ADRA1B
ABCC8 = fromid=5,from=ABCC8
ADRA1D = fromid=23,from=ADRA1D

관련 정보