awk変数に置き換える

awk変数に置き換える

デフォルトでは、アドレスに置き換えられるように$1catファイルの後ろに)変数をコピーして置き換える必要があります。私の試みは次のとおりです。sample/disk1/ngsep/"$sample"/"$1"_bowtie2_readpos.stats

cat samples_long.10ids.txt | awk -v sample="$1" '{gsub(/_USD.*/,"",sample); print $sample,$1}'

次を生成します。

P2_142_USD16089440L_HJM27DSXX_L3 P2_142_USD16089440L_HJM27DSXX_L3
P2_144_USD16089441L_HJM27DSXX_L3 P2_144_USD16089441L_HJM27DSXX_L3
P2_145_USD16089442L_HJM27DSXX_L3 P2_145_USD16089442L_HJM27DSXX_L3
P2_168_USD16089450L_HJM27DSXX_L3 P2_168_USD16089450L_HJM27DSXX_L3
P2_171_USD16089451L_HJM27DSXX_L4 P2_171_USD16089451L_HJM27DSXX_L4
P2_172_USD16089452L_HJM27DSXX_L4 P2_172_USD16089452L_HJM27DSXX_L4
P2_188_USD16089456L_HJM27DSXX_L4 P2_188_USD16089456L_HJM27DSXX_L4
P2_262_USD16089477L_HJJNWDSXX_L2 P2_262_USD16089477L_HJJNWDSXX_L2
P2_270_USD16089479L_HJJNWDSXX_L2 P2_270_USD16089479L_HJJNWDSXX_L2
P2_271_USD16089480L_HJJNWDSXX_L4 P2_271_USD16089480L_HJJNWDSXX_L4

しかし、私は以下が必要です:

P2_142 P2_142_USD16089440L_HJM27DSXX_L3
P2_144 P2_144_USD16089441L_HJM27DSXX_L3
P2_145 P2_145_USD16089442L_HJM27DSXX_L3
P2_168 P2_168_USD16089450L_HJM27DSXX_L3
P2_171 P2_171_USD16089451L_HJM27DSXX_L4
P2_172 P2_172_USD16089452L_HJM27DSXX_L4
P2_188 P2_188_USD16089456L_HJM27DSXX_L4
P2_262 P2_262_USD16089477L_HJJNWDSXX_L2
P2_270 P2_270_USD16089479L_HJJNWDSXX_L2
P2_271 P2_271_USD16089480L_HJJNWDSXX_L4

より長いパイプラインで使用するには、次の手順に従ってください。

cat samples_long.10ids.txt | 
cat `awk -v sample="$1" 'BEGIN {gsub(/_USD.*/,"",sample); print "/disk1/ngsep/"$sample"/"$1"_bowtie2_readpos.stats"}'` | 
awk '{if(NR<151) {print $1,$2,$3,$4,$5,$3/$5*100} else {print $0}}' | 
less

修正する

@casの回答のおかげで、うまく機能できました。パイプラインをより長く変更しました。

tail -n +1 `awk '{sample=$1; gsub(/_USD.*/,"",sample); print "/disk1/ngsep/"sample"/"$1"_bowtie2_readpos.stats"}' samples_long.10ids.txt` | awk 'm=($1 ~ /^[0-9]+$/) {print $0,$3/$5*100.0} !m {print $0}' | awk 'm=($1 == "==>") {save_location=$2} !m&&$1=="1",$1=="Bases" {print > save_location}'

説明する:

まず、次の形式の複数のファイルが異なる場所にあります。

1 44270430 2888669 939293704 101672177
2 39504262 2535442 939293704 101672177
3 36179652 2298760 939293704 101672177
4 35187362 2216378 939293704 101672177
5 31718310 1957024 939293704 101672177
...
145 30614327 2148102 939293704 101672177
146 31053766 2211019 939293704 101672177
147 33769500 2475193 939293704 101672177
148 34799685 2574711 939293704 101672177
149 38192883 2761700 939293704 101672177
150 41098709 2974392 939293704 101672177

Alignments      939293704       101672177
Bases   140205023688    15190431468

3列を5列に分けて100を掛けて6列に保存する演算をしたいと思います。結果:

1 44270430 2888669 939293704 101672177 2.84116
2 39504262 2535442 939293704 101672177 2.49374
3 36179652 2298760 939293704 101672177 2.26095
4 35187362 2216378 939293704 101672177 2.17993
5 31718310 1957024 939293704 101672177 1.92484
...
145 30614327 2148102 939293704 101672177 2.11277
146 31053766 2211019 939293704 101672177 2.17465
147 33769500 2475193 939293704 101672177 2.43448
148 34799685 2574711 939293704 101672177 2.53237
149 38192883 2761700 939293704 101672177 2.71628
150 41098709 2974392 939293704 101672177 2.92547

Alignments      939293704       101672177
Bases   140205023688    15190431468

それでは、より長い命令を説明しましょう。

`awk '{sample=$1; gsub(/_USD.*/,"",sample); print "/disk1/ngsep/"sample"/"$1"_bowtie2_readpos.stats"}' samples_long.10ids.txt` |

だからsamples_long.10ids.txtP2_142結果:

/disk1/ngsep/P2_142/P2_142_USD16089440L_HJM27DSXX_L3_bowtie2_readpos.stats
/disk1/ngsep/P2_144/P2_144_USD16089441L_HJM27DSXX_L3_bowtie2_readpos.stats
/disk1/ngsep/P2_145/P2_145_USD16089442L_HJM27DSXX_L3_bowtie2_readpos.stats
/disk1/ngsep/P2_168/P2_168_USD16089450L_HJM27DSXX_L3_bowtie2_readpos.stats
/disk1/ngsep/P2_171/P2_171_USD16089451L_HJM27DSXX_L4_bowtie2_readpos.stats
...

tail -n +1:印刷されたアドレスに対応するすべてのファイル(標準出力)を読み取り、そのawk場所を追加する必要があるため、この方法を使用します。結果:

==> /disk1/ngsep/P2_142/P2_142_USD16089440L_HJM27DSXX_L3_bowtie2_readpos.stats <==
1 37000568 2614993 747883433 76303046
2 33228316 2330791 747883433 76303046
...
149 33852828 2660530 747883433 76303046
150 36161756 2836045 747883433 76303046

Alignments      747883433       76303046
Bases   111613795461    11392665612

==> /disk1/ngsep/P2_144/P2_144_USD16089441L_HJM27DSXX_L3_bowtie2_readpos.stats <==
1 40000373 2754292 838333186 82982133
2 35955786 2451917 838333186 82982133
...

awk 'm=($1 ~ /^[0-9]+$/) {print $0,$3/$5*100.0} !m {print $0}' | ここでは、$1 が数値と一致する場合にのみ印刷し、一致しない場合は何もせずに行全体を印刷します。結果:

==> /disk1/ngsep/P2_142/P2_142_USD16089440L_HJM27DSXX_L3_bowtie2_readpos.stats <==
1 37000568 2614993 747883433 76303046 3.42711
2 33228316 2330791 747883433 76303046 3.05465
...
149 33852828 2660530 747883433 76303046 3.48679
150 36161756 2836045 747883433 76303046 3.71682

Alignments      747883433       76303046
Bases   111613795461    11392665612

==> /disk1/ngsep/P2_144/P2_144_USD16089441L_HJM27DSXX_L3_bowtie2_readpos.stats <==
1 40000373 2754292 838333186 82982133 3.31914
2 35955786 2451917 838333186 82982133 2.95475
...

awk 'm=($1 == "==>") {save_location=$2} !m&&$1=="1",$1=="Bases" {print > save_location}' 操作を実行したら、各ファイルを特定のディレクトリに保存する必要があります。そのため、tail -n +1出力の==>間にファイルの場所を追加し、ifに割り当ててその場所を変数に保存します。それ以外の場合は、パターン間の残りの部分を指すアドレスに保存します。例に対応するファイルを例に挙げます。<==save_location$2$1=="==>"1Basessave_locationP2_142

1 37000568 2614993 747883433 76303046 3.42711
2 33228316 2330791 747883433 76303046 3.05465
3 30544208 2130666 747883433 76303046 2.79237
4 29727794 2059047 747883433 76303046 2.69851
5 26873913 1825829 747883433 76303046 2.39287
...
145 27262253 2093226 747883433 76303046 2.74331
146 27992017 2188217 747883433 76303046 2.8678
147 30385435 2433407 747883433 76303046 3.18913
148 31218703 2514902 747883433 76303046 3.29594
149 33852828 2660530 747883433 76303046 3.48679
150 36161756 2836045 747883433 76303046 3.71682

Alignments      747883433       76303046
Bases   111613795461    11392665612

ベストアンサー1

これはsedを使用して簡単に実行できます。

$ sed -E -e 's/^((.*)_USD.*)/\2 \1/' input.txt 
P2_142 P2_142_USD16089440L_HJM27DSXX_L3
P2_144 P2_144_USD16089441L_HJM27DSXX_L3
P2_145 P2_145_USD16089442L_HJM27DSXX_L3
P2_168 P2_168_USD16089450L_HJM27DSXX_L3
P2_171 P2_171_USD16089451L_HJM27DSXX_L4
P2_172 P2_172_USD16089452L_HJM27DSXX_L4
P2_188 P2_188_USD16089456L_HJM27DSXX_L4
P2_262 P2_262_USD16089477L_HJJNWDSXX_L2
P2_270 P2_270_USD16089479L_HJJNWDSXX_L2
P2_271 P2_271_USD16089480L_HJJNWDSXX_L4

sedスクリプトは、2つのキャプチャグループ、(つまりおよびで囲まれた正規表現パターンを使用します)。 1つ目はフル入力ライン、2つ目は前のラインの最初の部分です_USD。各入力行を2番目のキャプチャグループ(\2)、スペースに置き換えてから、1番目のキャプチャグループ()に置き換えます\1

または以下を使用してawk

awk -F'_' -e '{print $1 "_" $2 " " $0}' input.txt 

入力フィールド区切り文字をに設定し、_(各入力行に対して)下線とスペースを使用して最初の2つのフィールドを印刷し、入力行全体を印刷します。


コマンドにはいくつかの問題があります。

cat samples_long.10ids.txt | \
  awk -v sample="$1" '{gsub(/_USD.*/,"",sample); print $sample,$1}'
  1. ファイルをawkにパイプするためにcatは必要ありません。 awkは、コマンドラインから引数として指定されたファイル名を読み取ることができます。

  2. awk変数をsample"$1"に設定しています。私はいくつかの(表示されていない)シェルスクリプトラッパーの最初のパラメータではなく、awkの最初のフィールドを意味すると思います。それは動作しません。$1awkはシェルには存在しません。 awkが入力データ行を読み取るときにのみ存在します。

  3. フィールド区切り文字として何を使用すべきかをawkに伝えていないので、デフォルトは空白(スペースとタブ)です。入力例には空白文字がないため、$ 1は入力行全体($ 1と呼ばれます$0)です。

  4. 「$sample」を印刷中です。これは、変数に含まれるフィールド番号を印刷したいことをawkに伝えますsample

    sample 文字列を含むため、その0コンテキストではprint $sample-equivalentとして評価されますprinting $0。したがって、コードは有効ですprint $0 $1。これはうまくいきますprint $0 $0。行全体を2回印刷します。

  5. sample(計算結果のフィールド番号ではありませんsample)コンテンツ自体を印刷するにはprint sample

  6. 4番と5番のエントリには、より多くの説明が必要な場合、または少なくとも理解しやすい例が必要な場合があります。

    NFawkが入力ラインを読み取るたびに、ラインのフィールド数という変数を自動的に設定します。

    フィールド数を印刷するには、を印刷するだけですNF。フィールド番号がNFなどのフィールドを印刷するには、印刷します$NF(これにより、入力行の最後のフィールドが印刷されます)。

    NF(整数)に対して算術およびその他の演算を実行することもできます。たとえば、print $(NF-1)最後から2番目のフィールドが印刷されます。

    コードに戻り、$sample整数コンテキストにはsample値があるため、完全な入力行を0印刷しました。$0

  7. 上記のすべてを考慮すると、次のように動作します。

    awk '{sample=$1; gsub(/_USD.*/,"",sample); print sample,$1}' samples_long.10ids.txt
    

    しかし、このような単純な作業を行うには複雑すぎます。 awkは入力を下線で区切られたフィールドに分割できるため、これを行う方が簡単です。

    awk -F'_' -e '{print $1 "_" $2 " " $0}' samples_long.10ids.txt
    

おすすめ記事