私はテキストファイルを扱っていますが、インターネット検索や質問にもかかわらず解決できない問題に遭遇しました。
このファイル(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
次に、2番目の列に基づいてソートして、次のようにします。
>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
しかし、2番目の列が変更されるたびにファイルを分割する方法が見つかりませんでした。このファイルをどのように分割できますか?
ありがとうございます!
答え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