2番目のファイルの列名を使用して1番目のファイルの列サブセットを取得する

2番目のファイルの列名を使用して1番目のファイルの列サブセットを取得する

2つのテキストファイルがあります。最初のファイルは、次のようにタブ区切りのファイルです。

chrom   pos ref alt a1  a2  a3  a4
10  12345   C   T   aa  bb  cc  dd
10  12345   C   T   aa  bb  cc  dd
10  12345   C   T   aa  bb  cc  dd
10  12345   C   T   aa  bb  cc  dd
10  12345   C   T   aa  bb  cc  dd
10  12345   C   T   aa  bb  cc  dd

2番目のファイルは次のとおりです。

a1
a4

2番目のファイルの最初のファイルの列と最初のファイルの最初の4列を抽出したいと思います。したがって、上記の場合、出力は次のようになります。

chrom   pos ref alt a1  a4
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd

シェルでこれを行いたいです。どうすればいいですか?私のファイルはここに示されているよりも大きいので、最初のファイルには多くの列があります。

cut -f 1-4,$(grep -Fwf file2.txt <(head -1 file1.txt)) file1.txt

ベストアンサー1

perl問題がない場合:

$ perl -F'\t' -lane 'if(!$#ARGV){ $h{$_}=1; close ARGV if eof; next }
                     @i = grep { exists $h{$F[$_]} } 4..$#F if $.==1;
                     print join "\t", @F[0..3, @i]' f2.txt f1.tsv
chrom   pos ref alt a1  a4
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd
10  12345   C   T   aa  dd

ハッシュ変数は、2番目のファイルの行をキーとして使用します。

その後、grepハッシュキーのフィールド名をテストして、TSVファイルのヘッダー行からインデックスを取得するために使用されます。

最後に、最初の4列とフィルタ処理されたインデックス値が印刷に使用されます。

おすすめ記事