簡體   English   中英

使用條件循環多個列中的值,如果在 AWK 中為真,則打印第一列值

[英]Loop over values in multiple colums with condition and print first column value if true in AWK

我的數據如下(這只是一個示例,真實數據有 ~20,000 行):

原始原始數據(tsv):

Names   USA EU  FR
Jim     3   12  5
John    8   4   7
Jane    12  35  3
Sue     6   3   9

原始數據圖像:

原始數據

我想遍歷從 col 2 開始的每個 col,如果值大於 5,則打印該行的第 1 列值。 結果數據應如下所示(制表符分隔):

產生的原始數據(tsv):

USA   EU   FR
John  Jim  John
Jane  Jane Sue
Sue 

結果數據的圖像:

結果數據

我嘗試了以下方法:

    awk -F"\t" '{ 
            for(i=2; i<=NF; i++) {
                if($i > 5){
                    print $1 
                } 
            }
        }' file > results

但它將所有結果打印在單個列中,並且不獲取其他列的標題。 我還嘗試在每個循環步驟中使用print FNR == i {print $1} "\n"捕獲標頭,但出現與索引相關的語法錯誤:

    awk: cmd. line:4:                 print FNR == i {print $1} "\n"
    awk: cmd. line:4:                                ^ syntax error
    awk: cmd. line:8:     }
    awk: cmd. line:8:     ^ syntax error

一個GNU awk (用於多維數組)的想法:

awk '
BEGIN { FS=OFS="\t" }
NR==1 { for (col=2;col<=NF;col++)
            output=output (col==2 ? "" : OFS) $col
        print output
        next
      }
      { for (col=2;col<=NF;col++)
            if ($col > 5)
               names[++count[col]][col]=$1
      }
END   { for (col=2;col<=NF;col++)  
            maxlines=(count[col]>maxlines ? count[col] : maxlines)
        for (lineno=1;lineno<=maxlines;lineno++) {
            output=""
            for (col=2;col<=NF;col++)
                output=output (col==2 ? "" : OFS) names[lineno][col]
            print output
        }
      }
' file.tsv

這會產生:

USA     EU      FR
John    Jim     John
Jane    Jane    Sue
Sue

您提供的預期輸出未顯示您描述為您的要求,所以也許這就是您真正想要的:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR > 1 {
    for ( i=2; i<=NF; i++ ) {
        $i = ( $i > 5 ? $1 : "" )
    }
}
{
    $1 = ""
    sub(OFS,"")
    print
}

$ awk -f tst.awk file
USA     EU      FR
        Jim
John            John
Jane    Jane
Sue             Sue

不需要任何數組的awk解決方案:

{m,g}awk '
  BEGIN { FS=(OFS="\t")"+" 
} !_<NR { gsub(    "\t(([-][0-9]+|[+]?[0-4])([.][0-9]*)?)(\t|$)",
                    "\t_\t")
          gsub("[0-9]+", $!_) } sub("^[^\t]*\t",_)^_'


USA   EU    FR
_     Jim   Jim
John  _     John
Jane  Jane  _
Sue   _     Sue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM