Linux 将变量分配给awk';{if…}';while循环中的语句

Linux 将变量分配给awk';{if…}';while循环中的语句,linux,bash,awk,while-loop,Linux,Bash,Awk,While Loop,我正在努力使用我在while循环中为awk设置的变量 例如,我有一个包含以下内容的文件: 1-WW (2, 17.0) (3, 25.0) (4, 32.0) (5, 37.0) (6, 42.0) (7, 46.0) (8, 50.0) (9, 53.0) (10, 56.0) (11, 59.0) (12, 62.0) (13, 65.0) (14, 67.0)

我正在努力使用我在
while循环中为
awk
设置的变量

例如,我有一个包含以下内容的文件:

1-WW
(2, 17.0)       (3, 25.0)       (4, 32.0)       (5, 37.0)       (6, 42.0)       (7, 46.0)       (8, 50.0)       (9, 53.0)       (10, 56.0)      (11, 59.0)      (12, 62.0)      (13, 65.0)   (14, 67.0)    (15, 70.0)       (16, 72.0)      (17, 74.0)      (18, 77.0)      (19, 79.0)      (20, 81.0)      (21, 83.0)      (22, 84.0)      (23, 86.0)      (24, 88.0)      (25, 89.0)      (26, 90.0)   (27, 90.0)
5-Ferm
(2, 16.0)       (3, 24.0)       (4, 29.0)       (5, 34.0)       (6, 37.0)       (7, 41.0)       (8, 43.0)       (9, 46.0)       (10, 48.0)      (11, 50.0)      (12, 52.0)      (13, 54.0)      (14, 56.0)      (15, 58.0)      (16, 59.0)
循环的目的是:

  • 取以“
    ”^(“
    ”开头的行,并将其放入一个包含两列的文本文件-完成
  • 根据第二列对文件进行排序,并将最大值分配给名为
    max
    -DONE的变量
  • 查找列2
    ==$max
    所在的行,并查找列$1的
    min
    值并附加到输出-帮助
  • 我所做的循环如下。它相当笨重,因为我对bash还比较陌生,并且仍然非常了解! 我正在努力将我的变量
    $max
    调用到最后的
    awk
    行中。欢迎提供任何建议

    我正在使用一个
    while循环
    ,因为我将要使用的实际文件有多行,如上面的示例,我想对以
    “^(“
    我已经尝试了很多将变量分配到awk的方法,下面是关于这里的问题的答案,但我似乎无法找到任何可行的方法

    #!/usr/bin/env bash
    
    # read through all lines and if the start with "(" do ...
    while IFS='\t' read -r LINE || [ -n "${LINE}" ]; do
            if [[ "${LINE}" == "("* ]]; then
                    echo "line: ${LINE}"; # print out line to make sure correct
                    echo "${LINE}" | xargs -n 2 | sed 's/(//g' | sed 's/)//g' | awk -F"," '$1=$1' OFS="\t" > loop_test; # make all (,) into two columns and read into loop_test
                    cat loop_test;
                    max= sort -nrk2,2 loop_test | awk '{print $2}' | head -n 1 # sort by columns 2 and find largest value - input to variable max
                    echo $max # check variable max has been assinged
                    awk -v var="$max" '{ if ($2 == var) { print } }' loop_test | sort -nrk1,1 | tail -n 1 | awk '{print $1}' >> out # now find all rows where column 2 = $max and find lowest value of column 1 - send value to ouptut
            fi
    done < test
    
    提前感谢您的帮助和建议:)

    对于任何POSIX awk:

    $ cat tst.awk
    BEGIN { FS="[)(,[:space:]]+" }
    /^\(/ {
        delete vals
        max = $3
        vals[$3] = $2
        for (i=5; i<=NF; i+=2) {
            if ( $i > max ) {
                max = $i
                vals[$i] = ($i in vals ? vals[$i] " " : "") $(i-1)
            }
        }
        split(vals[max],p)
        min = p[1]
        for (i in p) {
            min = (p[i] < min ? p[i] : min)
        }
        print min
    }
    
    $ awk -f tst.awk file
    26
    16
    
    $cat tst.awk
    开始{FS=“[)(,[:空格:]+”}
    /^\(/ {
    删除VAL
    最高=3美元
    VAL[$3]=2美元
    对于(i=5;i最大值){
    max=$i
    VAL[$i]=(VAL中的$i?VAL[$i]:“”)$(i-1)
    }
    }
    拆分(VAL[max],p)
    min=p[1]
    对于(p中的i){
    min=(p[i]
    首先,特别感谢您以代码的形式添加您的工作,请继续。唯一的一件事是,请您在问题中添加输入和预期输出的示例,并让我们知道。
    max=sort |…
    ->
    max=$(sort |…)
    我已经按照您的建议编辑了我的问题-谢谢。尽管@KamilCuk已经解决了我的问题,而且它也能工作!谢谢您:D如果是评论,我如何接受这个答案?请检查您提供的第二个示例输入行的预期输出-我认为应该是
    16
    ,而不是
    30
    。也请参见哦,是e> 16
    对不起!现在编辑
    $ cat tst.awk
    BEGIN { FS="[)(,[:space:]]+" }
    /^\(/ {
        delete vals
        max = $3
        vals[$3] = $2
        for (i=5; i<=NF; i+=2) {
            if ( $i > max ) {
                max = $i
                vals[$i] = ($i in vals ? vals[$i] " " : "") $(i-1)
            }
        }
        split(vals[max],p)
        min = p[1]
        for (i in p) {
            min = (p[i] < min ? p[i] : min)
        }
        print min
    }
    
    $ awk -f tst.awk file
    26
    16