如何从"表格中提取值" awk的文本文件

时间:2014-05-23 08:56:16

标签: regex bash awk

所有
我有两个这样的输入文件:
file1:

#W  #S  #this line dosen't exit
110 170 Bias
110 200 Bias
110 215 Bias
110 320 Bias
125 170 Bias
125 200 Bias
125 215 Bias
125 320 Bias
135 170 Bias
135 200 Bias
135 215 Bias
135 320 Bias
140 170 Bias
140 200 Bias
140 215 Bias
140 320 Bias

file2:

FUNCTION BIAS ( W, S )
Bias = 0
IF AND ( W >= 0, W < 120 ) THEN
    IF ( S >= 0 ) THEN Bias = -1
    IF ( S >= 180 ) THEN Bias = -2
    IF ( S >= 190 ) THEN Bias = -3
    IF ( S >= 200 ) THEN Bias = -4
    IF ( S >= 210 ) THEN Bias = -5
    IF ( S >= 220 ) THEN Bias = -6
    IF ( S >= 240 ) THEN Bias = -7
ENDIF

IF AND ( W >= 120, W < 130 ) THEN
    IF ( S >= 0 ) THEN Bias = -11
    IF ( S >= 180 ) THEN Bias = -12
    IF ( S >= 190 ) THEN Bias = -13
    IF ( S >= 200 ) THEN Bias = -14
    IF ( S >= 210 ) THEN Bias = -15
    IF ( S >= 220 ) THEN Bias = -16
    IF ( S >= 240 ) THEN Bias = -17
ENDIF

IF AND ( W >= 130, W < 140 ) THEN
    IF ( S >= 0 ) THEN Bias = 1
    IF ( S >= 180 ) THEN Bias = 2
    IF ( S >= 190 ) THEN Bias = 3
    IF ( S >= 200 ) THEN Bias = 4
    IF ( S >= 210 ) THEN Bias = 5
    IF ( S >= 220 ) THEN Bias = 6
    IF ( S >= 240 ) THEN Bias = 7
ENDIF

IF ( W >= 140 ) THEN
    IF ( S >= 0 ) THEN Bias = 11
    IF ( S >= 180 ) THEN Bias = 12
    IF ( S >= 190 ) THEN Bias = 13
    IF ( S >= 200 ) THEN Bias = 14
    IF ( S >= 210 ) THEN Bias = 15
    IF ( S >= 220 ) THEN Bias = 16
    IF ( S >= 240 ) THEN Bias = 17
ENDIF

RETURN (Bias)

我想做的是找出数学函数的相应值:“BIAS(W,S)”,带有来自file1的输入(W,S)对

例如:W / S = 135/195,“W”满足

IF AND ( W >= 130, W < 140 )  

所以我们将去检查“S”

    IF ( S >= 0 ) THEN Bias = 1
    IF ( S >= 180 ) THEN Bias = 2
    IF ( S >= 190 ) THEN Bias = 3
    IF ( S >= 200 ) THEN Bias = 4
    IF ( S >= 210 ) THEN Bias = 5
    IF ( S >= 220 ) THEN Bias = 6
    IF ( S >= 240 ) THEN Bias = 7

然后最后我们可以发现S = 195在190和200之间,BIAS(W,S)的值是3

我想要的输出是这样的:

110 170 Bias -1
110 200 Bias -4
110 215 Bias -5
110 320 Bias -7
125 170 Bias -11
125 200 Bias -14
125 215 Bias -15
125 320 Bias -17
135 170 Bias 1
135 200 Bias 4
135 215 Bias 5
135 320 Bias 7
140 170 Bias 11
140 200 Bias 14
140 215 Bias 15
140 320 Bias 17 

人眼检查非常容易 但正如你所看到的,file2基本上是一个文本文件,而不是常规的2D数组文件,我该如何提取相应的值?任何提示?

2 个答案:

答案 0 :(得分:3)

我刚把你的逻辑翻译成了awk:

<强> script.awk:

{
    w=$1;
    s=$2;

    if (w >= 0 && w < 120) {
        if ( s >= 0) { bias= -1 }
        if ( s >= 180 ) { bias= -2 }
        if ( s >= 190 ) { bias= -3 }
        if ( s >= 200 ) { bias= -4 }
        if ( s >= 210 ) { bias= -5 }
        if ( s >= 220 ) { bias= -6 }
        if ( s >= 240 ) { bias= -7 }
    }

    if (w >= 120 && w < 130) {
        if ( s >= 0) { bias= -11 }
        if ( s >= 180 ) { bias= -12 }
        if ( s >= 190 ) { bias= -13 }
        if ( s >= 200 ) { bias= -14 }
        if ( s >= 210 ) { bias= -15 }
        if ( s >= 220 ) { bias= -16 }
        if ( s >= 240 ) { bias= -17 }
    }

    if (w >= 130 && w < 140) {
        if ( s >= 0) { bias= 1 }
        if ( s >= 180 ) { bias= 2 }
        if ( s >= 190 ) { bias= 3 }
        if ( s >= 200 ) { bias= 4 }
        if ( s >= 210 ) { bias= 5 }
        if ( s >= 220 ) { bias= 6 }
        if ( s >= 240 ) { bias= 7 }
    }

    if (w >= 140 ) {
        if ( s >= 0) { bias= 11 }
        if ( s >= 180 ) { bias= 12 }
        if ( s >= 190 ) { bias= 13 }
        if ( s >= 200 ) { bias= 14 }
        if ( s >= 210 ) { bias= 15 }
        if ( s >= 220 ) { bias= 16 }
        if ( s >= 240 ) { bias= 17 }
    }

    print $0" "bias; 

}

<强>执行:

awk -f script.awk  file1
110 170 Bias -1
110 200 Bias -4
110 215 Bias -5
110 320 Bias -7
125 170 Bias -11
125 200 Bias -14
125 215 Bias -15
125 320 Bias -17
135 170 Bias 1
135 200 Bias 4
135 215 Bias 5
135 320 Bias 7
140 170 Bias 11
140 200 Bias 14
140 215 Bias 15
140 320 Bias 17

答案 1 :(得分:1)

在“file2”下面运行tst.awk脚本,将脚本转换为awk的语言,并将其输出保存到名为“getbias.awk”的新文件中,然后运行:

awk -f getbias.awk '<your script>' file1

其中<your script>解析file1并调用下面生成的getbias()函数来获取每行的偏差值。

$ cat tst.awk
{
    sub(/BIAS/,"getbias")
    sub(/ENDIF/,"}")
    sub(/ THEN/,"")
    $0 = tolower($0)
}
/^function/ { sub(/\)/,",\tbias )"); $0 = $0 " {" }
/^return/   { $0 = $0 ORS "}" }
/^if/       { sub(/ and/,""); sub(/,/," \\&\\&"); $0 = $0 " {" }
{ print }

$ awk -f tst.awk file2
function getbias ( w, s ,       bias ) {
bias = 0
if ( w >= 0 && w < 120 ) {
    if ( s >= 0 ) bias = -1
    if ( s >= 180 ) bias = -2
    if ( s >= 190 ) bias = -3
    if ( s >= 200 ) bias = -4
    if ( s >= 210 ) bias = -5
    if ( s >= 220 ) bias = -6
    if ( s >= 240 ) bias = -7
}

if ( w >= 120 && w < 130 ) {
    if ( s >= 0 ) bias = -11
    if ( s >= 180 ) bias = -12
    if ( s >= 190 ) bias = -13
    if ( s >= 200 ) bias = -14
    if ( s >= 210 ) bias = -15
    if ( s >= 220 ) bias = -16
    if ( s >= 240 ) bias = -17
}

if ( w >= 130 && w < 140 ) {
    if ( s >= 0 ) bias = 1
    if ( s >= 180 ) bias = 2
    if ( s >= 190 ) bias = 3
    if ( s >= 200 ) bias = 4
    if ( s >= 210 ) bias = 5
    if ( s >= 220 ) bias = 6
    if ( s >= 240 ) bias = 7
}

if ( w >= 140 ) {
    if ( s >= 0 ) bias = 11
    if ( s >= 180 ) bias = 12
    if ( s >= 190 ) bias = 13
    if ( s >= 200 ) bias = 14
    if ( s >= 210 ) bias = 15
    if ( s >= 220 ) bias = 16
    if ( s >= 240 ) bias = 17
}

return (bias)
}