同じ行数のタブ区切りファイルが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