Linuxの列に基づいて単一のファイルを複数のファイルに分割する方法は?

Linuxの列に基づいて単一のファイルを複数のファイルに分割する方法は?

次の情報を含むテキストファイルがあります。

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
MTHFR   TCGA-BD-A2L6-01A-11D-A20W-10    4524    BCM GRCh38
SLC30A1 TCGA-BD-A2L6-01A-11D-A20W-10    7779    BCM GRCh38
USH2A   TCGA-BD-A2L6-01A-11D-A20W-10    7399    BCM GRCh38
SOS1    TCGA-BD-A2L6-01A-11D-A20W-10    6654    BCM GRCh38
TMEM51  TCGA-O8-A75V-01A-11D-A32G-10    55092   BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
PRDM16  TCGA-G3-A7M5-01A-11D-A33Q-10    63976   BCM GRCh38
DNAJC11 TCGA-G3-A7M5-01A-11D-A33Q-10    55735   BCM GRCh38
HNRNPCL2    TCGA-G3-A7M5-01A-11D-A33Q-10    440563  BCM GRCh38
C1orf94 TCGA-G3-A7M5-01A-11D-A33Q-10    84970   BCM GRCh38
NFYC    TCGA-G3-A7M5-01A-11D-A33Q-10    4802    BCM GRCh38
IPP TCGA-G3-A7M5-01A-11D-A33Q-10    3652    BCM GRCh38

ご覧のように、いくつかのサンプルがあり、「Tumor_Sample_Barcode」列に基づいてファイルを複数のファイルに分割したいと思います。出力ファイルの名前はSamplename.txtで指定する必要があります。

最初の出力 - TCGA-BD-A2L6-01A-11D-A20W-10.txt

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
MTHFR   TCGA-BD-A2L6-01A-11D-A20W-10    4524    BCM GRCh38
SLC30A1 TCGA-BD-A2L6-01A-11D-A20W-10    7779    BCM GRCh38
USH2A   TCGA-BD-A2L6-01A-11D-A20W-10    7399    BCM GRCh38
SOS1    TCGA-BD-A2L6-01A-11D-A20W-10    6654    BCM GRCh38

2番目の出力 - TCGA-O8-A75V-01A-11D-A32G-10.txt

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
TMEM51  TCGA-O8-A75V-01A-11D-A32G-10    55092   BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38

3番目の出力 - TCGA-G3-A7M5-01A-11D-A33Q-10.txt

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
PRDM16  TCGA-G3-A7M5-01A-11D-A33Q-10    63976   BCM GRCh38
DNAJC11 TCGA-G3-A7M5-01A-11D-A33Q-10    55735   BCM GRCh38
HNRNPCL2    TCGA-G3-A7M5-01A-11D-A33Q-10    440563  BCM GRCh38
C1orf94 TCGA-G3-A7M5-01A-11D-A33Q-10    84970   BCM GRCh38
NFYC    TCGA-G3-A7M5-01A-11D-A33Q-10    4802    BCM GRCh38
IPP TCGA-G3-A7M5-01A-11D-A33Q-10    3652    BCM GRCh38

このLinuxで何をすべきですか?

ベストアンサー1

Awk解決策:

awk 'NR==1{ h=$0 }NR>1{ print (!a[$2]++? h ORS $0 : $0) > $2".txt" }' file
  • NR==1{ h=$0 }- 最初の行をキャプチャ/次へ記録ヘッダーline(NRレコード番号を指し$0、現在の行を含む)
  • NR > 1- 最初の記録を除くすべての記録の場合:
    • <cond>? <operand_1> : <operand_2>- 古典的な三項演算子
    • !a[$2]++?- 最初の発生を確認バーコード$2連想配列のキーとして使用される値a
    • h ORS $0ORS- (出力レコード区切り記号、デフォルト\n)および現在のレコードに関連付けられている共通ヘッダー行$0
    • print ... > $2".txt"- カスタムコンテンツまたは現在の行(何も指定しない場合)をファイルに印刷します。<barcode_value>.txt

または、もう少し説明が必要なバージョンは次のとおりです。

awk 'NR==1 {header = $0; next}
     !header_printed[$2]++ {print header > $2".txt"}
     {print > $2".txt"}' < file

結果を見る:

$ head TCGA*.txt
==> TCGA-BD-A2L6-01A-11D-A20W-10.txt <==
Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
MTHFR   TCGA-BD-A2L6-01A-11D-A20W-10    4524    BCM GRCh38
SLC30A1 TCGA-BD-A2L6-01A-11D-A20W-10    7779    BCM GRCh38
USH2A   TCGA-BD-A2L6-01A-11D-A20W-10    7399    BCM GRCh38
SOS1    TCGA-BD-A2L6-01A-11D-A20W-10    6654    BCM GRCh38

==> TCGA-G3-A7M5-01A-11D-A33Q-10.txt <==
Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
PRDM16  TCGA-G3-A7M5-01A-11D-A33Q-10    63976   BCM GRCh38
DNAJC11 TCGA-G3-A7M5-01A-11D-A33Q-10    55735   BCM GRCh38
HNRNPCL2    TCGA-G3-A7M5-01A-11D-A33Q-10    440563  BCM GRCh38
C1orf94 TCGA-G3-A7M5-01A-11D-A33Q-10    84970   BCM GRCh38
NFYC    TCGA-G3-A7M5-01A-11D-A33Q-10    4802    BCM GRCh38
IPP TCGA-G3-A7M5-01A-11D-A33Q-10    3652    BCM GRCh38

==> TCGA-O8-A75V-01A-11D-A32G-10.txt <==
Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
TMEM51  TCGA-O8-A75V-01A-11D-A32G-10    55092   BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38

15文字の順序でファイル名を調整します。バーコード値:

awk 'NR==1{ h=$0 }NR>1{ print (!a[$2]++? h ORS $0 : $0) > substr($2, 1, 15)".txt" }' file 

おすすめ記事