タブで区切られたいくつかのファイルのマージ

タブで区切られたいくつかのファイルのマージ

100個のファイルがあり、各ファイルには57,816行があります。共通列に基づいてマージして、これらのファイルに対して外部結合を実行したいと思います。

Rでプログラムしていますが、非常に遅いです。

fileList <- list.files(, pattern=".txt")
pm_list=lapply(fileList, read.table)
merged_pm=merge_all(pm_list, by = "gene_short_name")

Bashでこれを行う簡単な方法はありますか?使用できるもう1つの方法はSQLですが、最初に100個のテーブルを作成してから結合する前にロードする必要がありますが、それほど効率的ではありません。

各ファイルの行数は同じです。そのため、共通列に基づいてマージしたいのですが、共通列の定数が他のファイルにわずかに上下に存在しないため、Rでcbindを使用することはできません。ファイルの各場所に同じ場所にあります。以下には2つのサンプルファイルがあります。 「gene_short_name」に基づいて参加したいと思います。

gene_short_name FPKM56

MT-TF   0.90
MT-TV   0
MT-RNR1 310.015
MT-TL1  0
MT-TM   0

ファイル2は次のようになります。

gene_short_name FPKM53

MT-TF   0
MT-TV   0.344
MT-TM   0.10
MT-TL1  0
MT-RNR1 0
MT-ND2  158.332

ベストアンサー1

次のスクリプトは、パラメータとして渡されたすべてのタブで区切られたファイルの列1(フィールド)に対して外部結合を実行する必要があります。それを使う参加するソートされたファイルに対して一度に2つのファイルを外部結合するコマンドです。

ヘッダー行を含むファイル内のすべての行を連結します。ヘッダーを除外するには、これら2つのsortコマンドをヘッダーを省略するソートファイルを生成するコマンドに変更します。

#!/bin/sh
if test $# -lt 2
then
    echo usage: gjoin file1 file2 ...
    exit 1
fi
sort -t $'\t' -k 1 "$1" > result
shift
for f in "$@"
do
    sort -t $'\t' -k 1 "$f" > temp
    join -1 1 -2 1 -t $'\t' result temp > newresult
    mv newresult result
done
cat result
rm result temp

古いシェルを使用している場合、$'\t'タブは置き換えられないため、を使用する必要があり、引用符の間に 'TAB'リテラルタブを配置する必要があります。

/bin/sh代わりに、次のような最新のシェル(bashやkshなど)が利用可能な場合は最適化できます。

sort -t $'\t' -k 1 "$f" > temp
join -1 1 -2 1 -t $'\t' result temp > newresult

に取り替えることができる

join -1 1 -2 1 -t $'\t' result <(sort -t $'\t' -k 1 "$f") > newresult

おすすめ記事