주어진 열의 내용이 변경될 때마다 파일 분할

주어진 열의 내용이 변경될 때마다 파일 분할

텍스트 파일 작업을 하고 있는데 인터넷 검색과 질문에도 불구하고 해결할 수 없는 문제에 부딪혔습니다.

이 파일(20,880행)을 2열(구분된) 내용을 기준으로 별도의 파일로 분할하고 싶습니다 |. 열 2의 내용이 변경될 때마다 새 파일이 필요합니다. 안타깝게도 열 2의 각 인스턴스에 대한 행 수가 일정하지 않으므로 파일을 각 n행으로 분할할 수는 없습니다.

원본 파일의 처음 몇 줄은 다음과 같습니다.

>00000000|gene_cluster:GC_00001105|genome_name:r7534_20160316|gene_callers_id:24
>00000001|gene_cluster:GC_00001105|genome_name:r7537_20160321|gene_callers_id:78
>00000002|gene_cluster:GC_00001105|genome_name:r7541_20160426|gene_callers_id:774
>00000003|gene_cluster:GC_00001105|genome_name:r7544_20160502|gene_callers_id:1034
>00000004|gene_cluster:GC_00001105|genome_name:r7547_20160512|gene_callers_id:330
>00000005|gene_cluster:GC_00001105|genome_name:r7550_20160517|gene_callers_id:2094
>00000006|gene_cluster:GC_00001290|genome_name:r7534_20160316|gene_callers_id:76
>00000007|gene_cluster:GC_00001290|genome_name:r7537_20160321|gene_callers_id:358
>00000008|gene_cluster:GC_00001290|genome_name:r7541_20160426|gene_callers_id:1601
>00000009|gene_cluster:GC_00001290|genome_name:r7544_20160502|gene_callers_id:2134

그런 다음 두 번째 열을 기준으로 정렬하여 다음을 제공합니다.

>00006406|gene_cluster:GC_00000001|genome_name:r7534_20160316|gene_callers_id:1988
>00006409|gene_cluster:GC_00000001|genome_name:r7537_20160321|gene_callers_id:1059
>00006410|gene_cluster:GC_00000001|genome_name:r7537_20160321|gene_callers_id:1811
>00006407|gene_cluster:GC_00000001|genome_name:r7537_20160321|gene_callers_id:1947
>00006411|gene_cluster:GC_00000001|genome_name:r7537_20160321|gene_callers_id:643
>00006408|gene_cluster:GC_00000001|genome_name:r7537_20160321|gene_callers_id:759
>00006412|gene_cluster:GC_00000001|genome_name:r7541_20160426|gene_callers_id:1252
>00006415|gene_cluster:GC_00000001|genome_name:r7541_20160426|gene_callers_id:1920
>00006414|gene_cluster:GC_00000001|genome_name:r7541_20160426|gene_callers_id:2021
>00006413|gene_cluster:GC_00000001|genome_name:r7541_20160426|gene_callers_id:2094

하지만 두 번째 열이 변경될 때마다 파일을 분할하는 방법을 찾지 못했습니다. 이 파일을 어떻게 분할할 수 있나요?

감사해요!

답변1

사용awk

$ awk -F"|" '{print > $2}' input_file
$ head gene_cluster*
==> gene_cluster:GC_00001105 <==
>00000000|gene_cluster:GC_00001105|genome_name:r7534_20160316|gene_callers_id:24
>00000001|gene_cluster:GC_00001105|genome_name:r7537_20160321|gene_callers_id:78
>00000002|gene_cluster:GC_00001105|genome_name:r7541_20160426|gene_callers_id:774
>00000003|gene_cluster:GC_00001105|genome_name:r7544_20160502|gene_callers_id:1034
>00000004|gene_cluster:GC_00001105|genome_name:r7547_20160512|gene_callers_id:330
>00000005|gene_cluster:GC_00001105|genome_name:r7550_20160517|gene_callers_id:2094

==> gene_cluster:GC_00001290 <==
>00000006|gene_cluster:GC_00001290|genome_name:r7534_20160316|gene_callers_id:76
>00000007|gene_cluster:GC_00001290|genome_name:r7537_20160321|gene_callers_id:358
>00000008|gene_cluster:GC_00001290|genome_name:r7541_20160426|gene_callers_id:1601
>00000009|gene_cluster:GC_00001290|genome_name:r7544_20160502|gene_callers_id:2134

답변2

awk -F'|' '$2 != out{close(out); out=$2} {print > out}'

각 출력 파일을 닫지 않으면 동시에 열린 파일의 임계값이 초과되면 awk 버전에 따라 awk 스크립트가 실패하거나 크게 느려집니다. 예를 참조하세요.SSL 인증서를 분할할 때 오류가 발생했습니다. 출력 파일이 너무 많습니다. 10또는awk-cannot-open-04477c9a875b80-csv-for-output-too-many-open-files

관련 정보