特定の文字列を抽出し、検索して置換するか、抽出した値を含む長い文字列を保持します。

特定の文字列を抽出し、検索して置換するか、抽出した値を含む長い文字列を保持します。

編集する必要がある入力ファイルは次のとおりです (行がさらにある場合があります)。

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についてイントロン_XXXXXXXX:X_XXXXXXXX:X、間の文字列を抽出したいイントロン_そして1番目:(その間の文字列は通常 FBgn で始まりますが、常にそうとは限りません)。

すると、次のようなリストができます(1列目はFBgnFBgn を変換する対応する名前の列は他にもあります):

## 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

次に、リストの 1 列目で抽出された文字列を検索します。

抽出された文字列の2列目に対応する値がある場合、ID全体を置き換えたいイントロン_FBgnXXXXXX:X_FBgnXXXXXX:X2 列目には対応する名前が入ります。

抽出した文字列が1列目に存在しない場合は、ID全体を置き換えたいイントロン_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

出力ファイルに ID が FBgn で始まらない行がないことを除いて、すべて正常に動作しているようです。

答え1

できますよ:

cat gene_map_table_fb_2014_01_short.tsv  |sed '1d' |awk {'print $2'} |awk 'BEGIN{FS=":"} {print $2}' |sed s/._//g

まずファイルをcatし、最初の行(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 番目のフィールドから余分な部分が削除され、必要な文字列だけが残ります。

  • `if ($2 in a) $2=a[$2]

    2 番目のフィールドの文字列が配列内のキーとして存在する場合はa、対応する値を置き換えます。

  • print

    修正された行が印刷されます。

使用bash

スクリプトでは、

if [ ! -z "$key" ]

と:

if [[ "$key" && "${map[$key]}" ]]

この時点でスクリプトが知る必要があるのは、 がkeyに存在するかどうかのようです。修正されたテストでは、 が空でないだけでなく、 に存在することもmap確認します。keymap

この 1 つの変更により、出力は次のようになります。

$ 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

余談ですが、はtext、が空でない[ ! -z "$key" ]場合、 true を返します。これは と同等です。これは非常に一般的なテストなので、 とさらに短縮できます。これを使用して、スクリプト内のいくつかの行を簡略化できます。key[ -n "$key" ][ "$key" ]bash

関連情報