[英]awk: print first column, then some values, and then all other columns
[英]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.