編集する必要がある入力ファイルは次のとおりです(より多くの行がある場合があります)。
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 intron_FBgn0035847:4_FBgn0035847:3 61 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2 intron_FBgn0032515:2_FBgn0032515:4 72 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
3 intron_FBgn0266486:5_FBgn0266486:4 58 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
4 intron_FBgn0031359:10_FBgn0031359:7 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 intron_FBgn0031359:10_FBgn0031359:8 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 intron_FBgn0031359:10_FBgn0031359:9 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
536 intron_CR31143:1_CR31143:2 40 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2番目の列の各IDについてIntron_XXXXXXXX:X_XXXXXXXX:Xの間の文字列を抽出したいイントロン_そして最初:(文字列の間は通常FBgnで始まりますが、必ずしもそうではありません)。
次に、次のリストがあります。FBGNそしてFBgnを変換したいその名前を持つ別の列:
## FlyBase Gene Mapping Table
## Generated: Fri Dec 20 12:37:29 2013
## Using datasource: dbi:Pg:dbname=fb_2014_01_reporting;host=flysql9;port=5432...
FBgn0035847 mthl7
FBgn0032515 loqs
FBgn0266486 CG45085
FBgn0031359 CG18317
次に、リストの最初の列から抽出された文字列を検索したいと思います。
抽出された文字列の2番目の列にその値がある場合は、ID全体を置き換えたいと思います。Intron_FBgnXXXXXX:X_FBgnXXXXXX:X2番目の列には対応する名前があります。
抽出された文字列が最初の列に存在しない場合は、ID全体を置き換えたいと思います。Intron_XXXXXXXX:X_XXXXXXXX:X抽出された文字列として。
次のスクリプトがあります。
ref="gene_map_table_fb_2014_01_short.tsv"
target="HC25_LNv_ZT02_intron_results.txt"
output="temptemp.txt"
declare -A map
while read line
do
if [[ ! -z "$line" ]] && [[ ! "$line" =~ ^#.* ]]
then
key=$(echo "$line" | cut -f 1)
value=$(echo "$line" | cut -f 2)
map[$key]=$value
fi
done < $ref
while read line
do
key=$(echo "$line" | sed -n 's/.*_\([^\.]*\)\:.*/\1/p' | head -1)
if [ ! -z "$key" ]
then
echo "$line" | sed 's/intron_[^[:space:]]*/'${map[$key]}'/g' >> $output
else
echo "$line" | sed 's/intron_[^[:space:]]*/'$key'/g' >> $output
fi
done < $target
出力ファイルにFBgnで始まらないIDを含む行が欠落していることを除いて、すべてがうまくいくようです。
答え1
できます:
cat gene_map_table_fb_2014_01_short.tsv |sed '1d' |awk {'print $2'} |awk 'BEGIN{FS=":"} {print $2}' |sed s/._//g
最初にファイルを分類し、最初の行(d1を含む列ヘッダー)を削除し、すべての列を印刷してから区切り、4_FBgn0035847
削除します。awk 'BEGIN{FS=":"} {print $2}'
number_
sed s/._//g
出力は次のとおりです
FBgn0035847
FBgn0032515
FBgn0266486
1FBgn0031359
1FBgn0031359
1FBgn0031359
CR31143
ただし、終了行が重複して削除される場合は、次のことができます。
cat gene_map_table_fb_2014_01_short.tsv |sed '1d' |awk {'print $2'} |awk 'BEGIN{FS=":"} {print $2}' |sed s/._//g |sed '$d'
したがって、出力は次のようになります。
FBgn0035847
FBgn0032515
FBgn0266486
1FBgn0031359
1FBgn0031359
1FBgn0031359
答え2
使用awk
これにより、タブ区切りの出力が生成されます。
$ awk -v OFS="\t" 'NR==FNR{a[$1]=$2;next} FNR==1{print;next} {sub(/intron_/, "", $2); sub(/:.*/,"",$2);if ($2 in a) $2=a[$2];print}' gene_map_table_fb_2014_01_short.tsv HC25_LNv_ZT02_intron_results.txt
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 mthl7 61 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2 loqs 72 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
3 CG45085 58 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
536 CR31143 40 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
説明する:
-v OFS="\t"
これにより、出力フィールド区切り文字がタブになります。
NR==FNR{a[$1]=$2;next}
a
これにより、コマンドラインの最初のファイルに基づいて、最初の列がキーで2番目の列が値である連想配列が作成されます。このnext
コマンドは、awk
残りのコマンドをスキップして次の行に移動するように指示します。マッピングファイルにはいくつかのコメント行が含まれています。
if
配列に追加されないように、追加の文を簡単に追加できますa
。しかし、無害なので、この複雑な問題はスキップされます。FNR==1{print;next}
これにより、ヘッダー行が変更されずに印刷されます。
{sub(/intron_/, "", $2); sub(/:.*/,"",$2)
これにより、2番目のフィールドの余分な内容が削除され、必要な文字列だけが残ります。
`もし($2 in a)$2=a[$2]
2番目のフィールドの文字列が配列のキーとして存在する場合は、
a
その値を置き換えます。print
変更された行が印刷されます。
使用bash
スクリプトからの置き換え
if [ ! -z "$key" ]
そして:
if [[ "$key" && "${map[$key]}" ]]
この時点ですべてのスクリプトが知っておくべきkey
ことはmap
。修正されたテストでは空でないことをkey
確認するだけでなく、map
。
この変更後、次のような結果が得られました。
$ cat temptemp.txt
bundle_id target_id length eff_length tot_counts uniq_counts est_counts eff_counts ambig_distr_alpha ambig_distr_beta fpkm fpkm_conf_low fpkm_conf_high solvable tpm
1 mthl7 61 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
2 loqs 72 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
3 CG45085 58 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
4 CG18317 4978 1430.739479 91 0 30.333333 105.539363 1.00E+00 1.00E+00 6.30E+00 1.77E+00 1.08E+01 F 1.42E+01
536 CR31143 40 0 0 0 0 0 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 F 0.00E+00
aside でtext
null でない場合は[ ! -z "$key" ]
true を返します。key
これは[ -n "$key" ]
一般的なテストなので、より短縮できます[ "$key" ]
。これはbash
スクリプトの数行を単純化するために使用できます。