各ファイルから1つのファイルに同じ列を抽出する

Aug 21 2020

171ファイルの次のデータセットがあります。

CHR:POS   REF:ALT   BREED

6:85406127 T:A 0.333333
6:85406128 T:C 0
6:85406129 C:G 0.333333
6:85406130 T:G 0.833333

必要な出力は

CHR:POS   REF:ALT   BREED BREED2 BREED3 ... 171st file

6:85406127 T:A 0.333333 0.33 0.5 .... 0.4
6:85406128 T:C NA 0.33 0.5 .... 0.4
6:85406129 C:G 0.333333 0.33 NA .... 0
6:85406130 T:G 0.833333 0.33 0.5 .... NA

ファイル名には品種名が含まれています。1列目と2列目には、すべてのファイルに同じ情報が含まれています。最初のファイルのすべての列を保持しながら、各ファイルから3番目の列のみを抽出するにはどうすればよいですか?

最初のファイルを他のフォルダーに移動して、抽出から除外しました。次のコマンドでは結果が得られませんでした。

cut -d " " -f3 *.txt | paste ../breedname.txt - > output.txt

これらの質問に示されているawkコマンドを使用する試みもありましたが、データセットでは機能しませんでした。

  • 複数のファイルから同じ列を1つに貼り付けます
  • ファイルのn列ごとに印刷する

どんな助けでも大歓迎です!

回答

kvantour Aug 21 2020 at 21:13

これは非常に迅速で汚い方法です:

ファイルが同じ順序であると仮定します。

$ awk '(FNR==NR){a[FNR]=$0;next}
       {a[FNR]=a[FNR] FS $NF}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

ヘッダーを少しきれいにしたい場合:

$ awk '(FNR==NR){a[FNR]=$0 (FNR==1?++c:"");next} {a[FNR]=a[FNR] FS $NF (FNR==1?++c:"")}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

ファイルが同じ順序ではないと仮定します。

$ awk '{key=$1 FS $2} (FNR==NR){a[key]=$0 (FNR==1?++c:"");next}
       {a[key]=a[key] FS $NF (FNR==1?++c:"")}
       END{for(i in a) print a[i]}' file1 file2 file3 ... filen
kupsef Aug 21 2020 at 21:40

私はこのようなことをします:

paste -d " " *.txt | awk '{printf "%s %s ",$1,$2; for (i = 3; i <= NF; i+=3){printf "%s ",$i} print ""}'

paste線を垂直に結合するため、すべての列が隣り合っています。その後、必要な列を選択するだけです。