특정 헤더 이름이 있는 행과 "1"이 포함된 열을 필터링합니다.

특정 헤더 이름이 있는 행과 "1"이 포함된 열을 필터링합니다.

다음과 같이 많은 열과 행이 포함된 대용량 파일이 있습니다.

A  B  C  D  E  F1  F2  F3  F4  F5
a1 b1 c1 d1 e1 0   0   1   0   1
a2 b2 c2 d2 e2 1   0   0   1   1
a3 b3 c3 d3 e3 1   1   0   0   1
....

A, B, C, D 및 E 열에는 일부 정보가 포함되어 있으며 F1-5 열은 일부 ID를 나타냅니다. 0 또는 1은 이 ID의 AE 정보가 존재하지 않음/존재함을 나타냅니다.

각 ID에 대한 파일을 생성하고 싶고 각 파일에는 ID가 가지고 있는 ABCDE 정보가 포함되어 있습니다. 예를 들어 F5의 처음 3줄에는 1이 3개 있으므로

F5.txt:

A  B  C  D  E 
a1 b1 c1 d1 e1 
a2 b2 c2 d2 e2 
a3 b3 c3 d3 e3

F1의 처음 세 줄에는 1이 두 개 있으므로

F1.txt:

A  B  C  D  E  
a2 b2 c2 d2 e2 
a3 b3 c3 d3 e3

awk를 사용하여 이 파일을 필터링하고 ID 이름(F1, F2...)으로 새 파일을 만들려면 어떻게 해야 합니까?

답변1

AWK해결책:

awk 'NR==1{ split($0,h); columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5]); next }
     { for (i=6;i<=NF;i++) 
           if ($i) { 
               if (!a[h[i]]++) print columns > h[i]".txt"; 
               print $1,$2,$3,$4,$5 > h[i]".txt" 
           } 
      }'  file
  • split($0,h)- 레코드 1을 배열로 분할 h하여 가져옵니다.머리글목록

  • columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5])- 공개 열 문자열 구성A B C D E

  • if($i)- 현재 필드(필드 6부터 시작)가비어 있는, 즉 ""(빈 문자열)이 아니거나 0- 추가 처리 준비가 되어 있음

  • h[i]- 현재를 가리킨다.파일 이름, F1즉 (또는 귀하가 쓴 대로:일부 ID를 나타냅니다.)

  • if (!a[h[i]]++) print columns > h[i]".txt"- 해당 이름의 파일을 h[i]처음으로 작성하는 경우 - 머리글/열 행을 인쇄합니다(첫 번째 행으로).


결과 보기:

$ head F*.txt
==> F1.txt <==
A B C D E
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

==> F2.txt <==
A B C D E
a3 b3 c3 d3 e3

==> F3.txt <==
A B C D E
a1 b1 c1 d1 e1

==> F4.txt <==
A B C D E
a2 b2 c2 d2 e2

==> F5.txt <==
A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

관련 정보