繁体   English   中英

如何使用awk从“表状”文本文件中提取值

[英]How to extract values from a “table-like” text file with awk

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

#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数组数字文件,如何提取相应的值? 有什么提示吗?

我只是将您的逻辑翻译成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

在“ 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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM