용어 목록이 포함된 모든 열 추출

용어 목록이 포함된 모든 열 추출

약 320개의 행과 약 1800개의 열(1.9MB)이 있는 데이터 파일()이 있고 data.txt(모든 행에 대해) 특정 열을 추출해야 합니다. 전체적인 레이아웃 data.txt은 다음과 같습니다.

 ID           Adipocyte - breast, donor2.CNhs11969.11327-117E4   ....
HGNC:8888                        0                               .... 
HGNC:9999                     123.92                             ....
HGNC:1000                      9.31                              .... 

list.txt추출해야 하는 열 목록(파일에)이 있지만 목록은 열 용어의 CNhsXXXXX 식별자로만 구성됩니다(예: 위 예의 경우 목록에는 다음 항목만 포함됩니다).CNhs11969, 전체 기간이 아님지방세포 - 유방, 기증자 2.CNhs11969.11327-117E4).

이전에 행 목록을 얻으려면 grep을 사용했지만 열 목록은 사용한 적이 없습니다. 둘러봤지만 여러 용어를 사용하여 여러 열을 파악하는 방법을 찾을 수 없습니다. 저는 유닉스를 처음 접했기 때문에(컴퓨팅 경험이 거의 없는 생물학자입니다) grep이 이 작업을 수행할 수 있는지 잘 모르겠습니다.

어떤 도움이라도 대단히 감사하겠습니다.

편집: 내 예제 출력은 ~1800개 열 중 ~850개 열입니다( list.txt내 파일의 용어만 포함). 예: 내 목록에 CNhs5006 및 CNhs7021만 포함된 경우 헤더에 이러한 용어가 있는 열만 필요합니다. 예 data.txt:

ID        XXXCNhs5006XXX   XXXCNhs6025XXX   XXXCNhs7021XXX   XXXCNhs8095XXX
HGNC:1111     1.23                 1.53             9.21            0
HGNC:2222     1.95                73.92               0           123.29 

원하는 출력의 예:

ID         XXXCNhs5006XXX   XXXCNhs7021
HGNC:1111          1.23          9.21
HGNC:2222          1.95           0

내 것은 list.txt단순한 용어 목록입니다(열 1개, 행 ~850개, 행당 검색어 1개). 예:

CNhs1111 CNhs2222 CNhs3333 CNhs4444

답변1

OP는 다음을 수행할 수 있다고 생각합니다.

  1. 헤더 읽기 data.txt및 열을 행으로 변환
  2. Grep일치하는 숫자 행을 가져옵니다.list.txt
  3. data.txt통과하다cut

열이 탭으로 구분된 경우 스크립트는 다음과 같습니다.

cut -f 1,$(
    head -n1 data.txt |
    tr '\t' '\n' |
    grep -nf list.txt |
    sed ':a;$!N;s/:[^\n]*\n/,/;ta;s/:.*//'
) data.txt

답변2

다음과 같이 시도해 볼 수 있습니다.

awk  -F'\t' -f script.awk column.names data

어디 script.awk:

NR == FNR { columns[NR] = $0; next }
NR > FNR && FNR == 1 {
    for (i = 1; i <= NF; i++) {
        for (j = 1; j < NR; j++) {
            if ($i ~ columns[j]) {
                selected[i] = 1;
                break;
            }
        }
    }
}
{
    for (i = 1; i <= NF; i++) {
        if (i in selected) printf $i "\t";
    }
    print "";
}

@Costas의 접근 방식은 독창적입니다. 그러나 조금 단순화할 수 있다고 생각합니다.

head -n1 data | tr '\t' '\n' | grep -nf column.names | cut -f1 -d: \
  | paste -sd, | xargs -I{} cut -f {} data

관련 정보