各ファイルの特定の列を選択して新しいファイルに貼り付けます。

各ファイルの特定の列を選択して新しいファイルに貼り付けます。

同じ行数のタブ区切りファイルが20個あります。各ファイルの4列目をすべて選択したいと思います。貼り付けた新しいファイルに一緒に追加されます。最後に、新しいファイルには20個の列があり、各列は20個の異なるファイルから来ます。

Unix / Linuxコマンドを使用してこれをどのように実行しますか?

20の同じ形式を入力してください。ここでは、ファイル1の4番目の列をA1として表示したいと思います。

chr1    1734966 1735009 A1       0       0       0       0       0       1       0
chr1    2074087 2083457 A1       0       1       0       0       0       0       0
chr1    2788495 2788535 A1       0       0       0       0       0       0       0
chr1    2821745 2822495 A1       0       0       0       0       0       1       0
chr1    2821939 2822679 A1       1       0       0       0       0       0       0
...

20列の出力ファイル。各列は、20個のファイルの4番目の列のいずれかから来ます。

A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
...

答え1

Bashでは、paste次のことができます。

paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt)

Pythonスクリプトと必要な数のファイル(python scriptname.py column_nr file1 file2 ... filen)を使用してください。

#! /usr/bin/env python

# invoke with column nr to extract as first parameter followed by
# filenames. The files should all have the same number of rows

import sys

col = int(sys.argv[1])
res = {}

for file_name in sys.argv[2:]:
    for line_nr, line in enumerate(open(file_name)):
        res.setdefault(line_nr, []).append(line.strip().split('\t')[col-1])

for line_nr in sorted(res):
    print '\t'.join(res[line_nr])

答え2

次のスクリプトはこれを行うためにawkを使用します。便宜上、ファイルの行数(r)を示す行番号を追加しました。貼り付ける列数はcで表示されます。

directory=/your-directory/
r=4
c=20

for n in $(seq 1 $r); do
echo "$n" >> rownumber.txt
done

for n in $(seq 1 $c); do
awk '{ print $4}' /$directory/file-$n.txt > /$directory/output-$n.txt
done

paste /$directory/rownumber.txt /$directory/output-[1-$c]*.txt > /$directory/newfile.txt

関連情報