다음과 같이 많은 열과 행이 포함된 대용량 파일이 있습니다.
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