2016-08-19 1 views
-1

헤더 행이있는 많은 열이있는 큰 데이터 파일 (csv 아님)이 있습니다. 열 머리글은 문자와 숫자가 포함 된 문자열입니다. 머리글이 두 번째 파일에있는 경우 해당 머리글을 기반으로 데이터 열을 추출하는 스크립트를 작성하고 싶습니다. 나는이 질문을 연구하고, AWK extract columns from file based on header selected from 2nd file에있는 답변에서 수정 한 스크립트를 썼다. 나는 그것이하는 일의 좋은 부분을 이해하지만, 나는 그것을 완전히 이해하지 못한다는 것을 인정할 것입니다. 나는 그것이 csv 파일을 위해 설계되었다는 것을 알고있다. 나는 내 파일과 함께 사용하려고 시도했지만, 작동시키지 못한다.헤더 파일을 사용하여 헤더를 기반으로 데이터 파일에서 열 추출

(참고 : $의 motif_list 및 $ affinity_matrix이 두 파일의 경로이며, 이전에 bash는 스크립트에 정의 된)

43 awk -v motif_list="$motif_list" -v affinity_matrix="$affinity_matrix" ' 
44   BEGIN { 
45     j=1 
46     while ((getline < motif_list) > 0) 
47     { 
48       col_names[j++] = $1 
49     } 
50     n=j-1; 
51     close(motif_list) 
52     for (i=1; i<=n; i++) s[col_names[i]] = i 
53    }  
54 
55   NR==1 { 
56     for (f=1; f<=NF; f++) 
57       if ($f in s) c[s[$f]]=f 
58     next 
59    } 
60 
61   { 
62     sep=" " 
63     for (f=1; f<=n; f++) 
64       { 
65         printf("%c%s",sep,$c[f]) 
66         sep=FS 
67       } 
68     print " " 
69   }' "$affinity_matrix" > $affinity_columns 

나 또한 (여기 (bash는 스크립트에 포함 된) 코드입니다 " '에서' '세퍼레이터 변경되었지만 그 샘플 입력 및 출력 테이블 여기에, 예를 들어)

그것을 옳은 방법이 아닐 수

입력 :

01,238,

출력은 :

A C 
1 3 
1 3 
1 3 
1 3 
1 3 

는 모든 입력은 많이 주시면 감사하겠습니다!

감사

답변

1

일반적인 접근 방법이다 (검증되지 않은 어떤 샘플 입력/출력을 제공하지 않았기 때문에) :

awk ' 
NR==FNR { names[$0]; next } 
FNR==1 { 
    for (i=1;i<=NF;i++) { 
     if ($i in names) { 
      nrs[i] 
     } 
    } 
} 
{ 
    c = 0 
    for (i=1;i<=NF;i++) { 
     if (i in nrs) { 
      printf "%s%s", (c++ ? OFS : ""), $i 
     } 
    } 
    if (c) { 
     print "" 
    } 
} 
' motif_list affinity_matrix