2016-10-05 13 views
2

ディレクトリ内の複数のテストファイルの平均値を$2として計算し、出力ファイルをtab-delimeted出力ファイルにマージしようとしています。出力ファイルは、prefで抽出されたファイル名が$1であり、$2" is the calculated average with one decimal, rounded up. There is also a header in the outputサンプルin $ 1 andパーセントin $ 2という2つのフィールドです。以下は近似しているようですが、出力にヘッダーを追加し、1つのタブ区切りファイルに結合し、小数点以下3桁まで四捨五入しています)、希望の出力を得られない方法がわかりません。ありがとうございました :)。 複数のテキストファイルのフィールドの平均を計算して1つにマージする

AASS  99.81 
ABAT  100.00 
ABCA10 0.0 

456_base

123_base.txt。TXT

ABL2  97.81 
ABO 100.00 
ACACA 99.82 

所望の出力(タブdelimeted)

Sample Percent 
123 66.6 
456 99.2 

バッシュ

for f in /home/cmccabe/Desktop/20x/percent/*.txt ; do 
bname=$(basename $f) 
pref=${bname%%_base_*.txt} 
awk -v OFS='\t' '{ sum += $2 } END { if (NR > 0) print sum/NR }' $f /home/cmccabe/Desktop/NGS/bed/bedtools/IDP_total_target_length_by_panel/IDP_unix_trim_total_target_length.bed > /home/cmccabe/Desktop/20x/coverage/${pref}_average.txt 
done 
+1

? – Sundeep

+0

それは大丈夫でしょう。ありがとうございました :)。 – Chris

+0

@glenn jackmanはディレクトリ( '/ home/cmccabe/Desktop/20x/percent/*。txt')内の100個の' .txt'ファイルをそれぞれ一度に参照せずに一度に使用できますか?ありがとうございました :)。 – Chris

答えて

2

をこの行を使用する場合。第三文字の後にファイル名を切り捨てるprintf "%3.3s"に注意してください:

$ cat ave.awk 
BEGIN {print "Sample", "Percent"}      # header 
BEGINFILE {s=c=0}          # at the start of every file reset 
{s+=$2; c++}           # sum and count hits 
ENDFILE{if(c>0) printf "%3.3s%s%.1f\n", FILENAME, OFS, s/c} 
                 # above output if more than 0 lines 

を実行して:どのようにperlのソリューションについて

$ touch empty_base.txt         # test for division by zero 
$ awk -f ave.awk 123_base.txt 123_base.txt empty_base.txt 
Sample Percent 
123 66.6 
456 99.2 
+0

ゼロによる除算。 –

+0

ありがとうございます:) – Chris

5

この1つは便利BEGINFILEENDFILEイベントを提供GNU AWKを、使用しています。

gawk ' 
    BEGIN {print "Sample\tPercent"} 
    BEGINFILE {sample = FILENAME; sub(/_.*/,"",sample); sum = n = 0} 
    {sum += $2; n++} 
    ENDFILE {printf "%s\t%.1f\n", sample, sum/n} 
' 123_base.txt 456_base.txt 

あなたが添付ディレクトリのパターンを与えている場合は、私はこのようなサンプル名を取得したいが:

match(FILENAME, /^.*\/([^_]+)/, m); sample = m[1] 

、その後、はい、これはOKです:gawk '...' /path/to/*_base.txt

そして盗みます

ENDFILE {printf "%s\t%.1f\n", sample, n==0 ? 0 : sum/n} 
3

perl

とゼロ除算に対して、ジェームス・ブラウンの答えに触発
$ perl -ane ' 
BEGIN{ print "Sample\tPercent\n" } 
$c++; $sum += $F[1]; 
if(eof) 
{ 
    ($pref) = $ARGV=~/(.*)_base/; 
    printf "%s\t%.1f\n", $pref, $sum/$c; 
    $c = 0; $sum = 0; 
}' 123_base.txt 456_base.txt 
Sample Percent 
123 66.6 
456 99.2 
  • BEGINブロックを用いて印刷ヘッダ
  • 空間上の入力ラインを分割し、各ライン、インクリメントカウンタの@Fアレイ
  • に保存して変数sumに追加することになる-aオプション
  • 場合、ファイルの末尾eofが検出されました。必要な形式で印刷します。
  • $ARGV現在のファイル名が含まれています。


ファイル名のフルパスが渡されますが、ファイル名だけではprefを取得するために使用する必要があり、その後、代わりのawkでは

($pref) = $ARGV=~/.*\/\K(.*)_base/; 
+0

'-n'を使用するのを忘れてしまいました。 '-l'を追加すると、' \ n'を印刷文に追加する必要はありません。 –

+0

@glennjackman、 '-a'は' -n'も呼び出します...'-l'はprintfで' \ n'を追加していないようですので、私は使用しませんでした。 – Sundeep

+0

私は '-a'についても知らなかった –

2

awk

$ awk -v OFS='\t' '{f=FILENAME;sub(/_.*/,"",f); 
        a[f]+=$2; c[f]++} 
       END{print "Sample","Percent"; 
        for(k in a) print k, sprintf("%.1f",a[k]/c[k])}' {123,456}_base.txt 

Sample Percent 
456 99.2 
123 66.6 
関連する問題