Linux 排序文件只获取行的最大值

Linux 排序文件只获取行的最大值,linux,shell,awk,Linux,Shell,Awk,我对文本文件和简单awk进行了排序,它们得到了第一行(平均最大值) 例如 Key Column1 Column2 Column3 ..... MaxValue Test1 500 400 200 500 Test1 499 400 200 500 Test1 499 399 200 499 Test1 498 100

我对文本文件和简单awk进行了排序,它们得到了第一行(平均最大值)

例如

 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test1    499     400     200               500
Test1    499     399     200               499
Test1    498     100     100               498
Test2    600     200     150               600
Test2    600     199     150               600
Test2    599     199     100               599
我可以使用下面的shell脚本来获取动态列

MaxValue=`awk -F'\t' -v OFS="MaxValue" 'NR==1 {for (i=1; i<=NF; i++) if ($i==OFS) {print i} }'
然后结果如下所示

 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test2    600     200     150               600
 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test1    499     400     200               500
Test2    600     200     150               600
Test2    600     199     150               600
只需通过键获取最高值。 但我想检查另一个动态列,如果相同的值只是打印。 结果如下:

 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test2    600     200     150               600
 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test1    499     400     200               500
Test2    600     200     150               600
Test2    600     199     150               600
有人有使用awk的好主意吗?
谢谢大家!

您必须在文件上迭代两次:一次收集最大值,一次查找与之匹配的行:

awk '
  NR == FNR && ( !($1 in max) || max[$1] < $NF ) {max[$1] = $NF} 
  NR != FNR && $NF == max[$1]
' file file
awk'
NR==FNR&(!(最大值为$1)| |最大值[$1]<$NF){max[$1]=$NF}
NR!=FNR&$NF==最大值[$1]
'文件

如果要提供包含最大值的列的名称:

awk -v colname="Column2" '
  NR == 1 {for (i=2; i<=NF; i++) if ($i == colname) maxcol = i}  
  NR == FNR && ( !($1 in max) || max[$1] < $maxcol ) {max[$1] = $maxcol} 
  NR != FNR && $maxcol == max[$1]
' file file
awk-v colname=“Column2”

NR==1{for(i=2;i您必须在文件上迭代两次:一次收集最大值,一次查找与之匹配的行:

awk '
  NR == FNR && ( !($1 in max) || max[$1] < $NF ) {max[$1] = $NF} 
  NR != FNR && $NF == max[$1]
' file file
awk'
NR==FNR&(!(最大值为$1)| |最大值[$1]<$NF){max[$1]=$NF}
NR!=FNR&$NF==max[$1]
'文件

如果要提供包含最大值的列的名称:

awk -v colname="Column2" '
  NR == 1 {for (i=2; i<=NF; i++) if ($i == colname) maxcol = i}  
  NR == FNR && ( !($1 in max) || max[$1] < $maxcol ) {max[$1] = $maxcol} 
  NR != FNR && $maxcol == max[$1]
' file file
awk-v colname=“Column2”

NR==1{for(i=2;i您必须在文件上迭代两次:一次收集最大值,一次查找与之匹配的行:

awk '
  NR == FNR && ( !($1 in max) || max[$1] < $NF ) {max[$1] = $NF} 
  NR != FNR && $NF == max[$1]
' file file
awk'
NR==FNR&(!(最大值为$1)| |最大值[$1]<$NF){max[$1]=$NF}
NR!=FNR&$NF==max[$1]
'文件

如果要提供包含最大值的列的名称:

awk -v colname="Column2" '
  NR == 1 {for (i=2; i<=NF; i++) if ($i == colname) maxcol = i}  
  NR == FNR && ( !($1 in max) || max[$1] < $maxcol ) {max[$1] = $maxcol} 
  NR != FNR && $maxcol == max[$1]
' file file
awk-v colname=“Column2”

NR==1{for(i=2;i您必须在文件上迭代两次:一次收集最大值,一次查找与之匹配的行:

awk '
  NR == FNR && ( !($1 in max) || max[$1] < $NF ) {max[$1] = $NF} 
  NR != FNR && $NF == max[$1]
' file file
awk'
NR==FNR&(!(最大值为$1)| |最大值[$1]<$NF){max[$1]=$NF}
NR!=FNR&$NF==max[$1]
'文件

如果要提供包含最大值的列的名称:

awk -v colname="Column2" '
  NR == 1 {for (i=2; i<=NF; i++) if ($i == colname) maxcol = i}  
  NR == FNR && ( !($1 in max) || max[$1] < $maxcol ) {max[$1] = $maxcol} 
  NR != FNR && $maxcol == max[$1]
' file file
awk-v colname=“Column2”


NR==1{(i=2;i预期输出是什么?哪些列被排序?预期输出是最后一个文本,并按MaxValue排序。'预期输出是什么?哪些列被排序?预期输出是最后一个文本,并按MaxValue排序。'预期输出是什么?哪些列被排序?预期输出是最后一个文本,并按MaxValue排序。'预期的输出?哪些列被排序?预期的输出是最后一个文本,并按MaxValue排序。“严格来说,没有必要对文件进行两次迭代;他可以将相关行保留在一个数组中,并在最后打印出来。然而,我对你的答案投了赞成票。是的,但代码要多一点(如果最大值发生变化,您必须忘记该键的记忆行)。这是性能和可维护性之间的权衡。您好,谢谢您的回答,我可以使用动态列值吗?例如awk-v var=“MaxValue”严格来说,没有必要对文件进行两次迭代;他可以将相关行保留在一个数组中,并在最后打印。但是,我已经投票支持了您的答案。是的,但代码要多一点(如果最大值更改,您必须忘记该键的记忆行)。这是性能和可维护性之间的折衷。您好,谢谢您的回答,我可以用动态列值来实现吗?比如awk-v var=“MaxValue”严格来说,没有必要对文件进行两次迭代;他可以将相关行保留在一个数组中,并在最后打印。但是,我已经投票支持了您的答案。是的,但代码要多一点(如果最大值更改,您必须忘记该键的记忆行)。这是性能和可维护性之间的折衷。您好,谢谢您的回答,我可以用动态列值来实现吗?比如awk-v var=“MaxValue”严格来说,没有必要对文件进行两次迭代;他可以将相关行保留在一个数组中,并在最后打印。但是,我已经投票支持了您的答案。是的,但代码要多一点(如果最大值更改,您必须忘记该键的记忆行)。这是性能和可维护性之间的折衷。您好,谢谢您的回答,我可以用动态列值来实现吗?比如awk-v var=“MaxValue”