1

複数のファイルから多くの計算を自動化しようとしています。私はExcelでそれを行い、必要な数式を持っています。

私の入力Input.txt

Start   End
0   0
1793    3233
3147    4045
4085    6751
28077   29336
29258   31431
29304   30010
31528   42846

私が取得しようとしているのは、Sizefrom からStarttoEndの可能性のあるオーバーラップを差し引くことです: たとえば、行 4 では、Start(3147)Endは行 3 (3233)Sizeとオーバーラップするため、そのオーバーラップにより、有効な値は 813 のみになります。

この例の行 8 (29304 - 30010) は重複しているだけでなく、行 7 (29258 - 31431) に含まれているため、有効なサイズは追加されません。

私の望ましい出力Out.txtは次のとおりです。

Start   End Size    No-Negatives    Overlap No-Negatives
0   0   0   0   0   0
1793    3233    1442    1442    -1792   0
3147    4045    813 813 87  87
4085    6751    2668    2668    -39 0
28077   29336   1261    1261    -21325  0
29258   31431   2096    2096    79  79
29304   30010   -1420   0   2128    2128
31528   42846   11320   11320   -96 0

必要な最終的な数値は、完全なテーブルがあれば簡単に計算でき、その合計が$4有効な合計サイズになります。

Input.txt元を列AとBに追加するExcelでそれを行い、次の式を使用して列$3を取得しまし$6Out.txt(サイズ、負数なし、重複、負数なし)

$3(ハ):=B3-(A3+F3)+2

$4(ニ):=IF(C3>0,C3,0)

$5(エ):=B2-A3+1

$6(女):=IF(E3>0,E3,0)

多くのファイルを処理するために列 `` を取得できるスクリプトはありますかbash?awk

前もって感謝します。

4

1 に答える 1

1

次のスクリプトを試してください。

の内容script.awk:

BEGIN { 
    FS = OFS = "\t"
}

FNR >= 3 { 
    $5 = L2 - $1 + 1 
    $6 = $5 > 0 ? $5 : 0 
    $3 = $2 - ($1 + $6) + 2 
    $4 = $3 > 0 ? $3 : 0 
    print $0
}

{
    L2 = $2
}

FNR < 3 { 
    print
    next
}

の次の内容を想定infile:

S Scer  E Scer
0   0
1793    3233
3147    4045
4085    6751
28077   29336
29258   31431
29304   30010
31528   42846

次のように実行します。

awk -f script.awk infile

それは以下をもたらします:

S Scer  E Scer
0   0 
1793 3233 1442 1442 -1792 0
3147 4045 813 813 87 87
4085 6751 2668 2668 -39 0
28077 29336 1261 1261 -21325 0
29258 31431 2096 2096 79 79
29304 30010 -1420 0 2128 2128
31528 42846 11320 11320 -1517 0

必要に応じてヘッダーを配置してください。

于 2013-10-04T20:31:55.933 に答える