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列とフィルタ処理されたインデックス値が印刷に使用されます。