最小和最大awk代码中的变量

时间:2018-12-01 04:52:39

标签: awk

目的是从输出文件第一行的字符7-12中获取最小值和最大值。

我使用2个变量(最小-最大)将所需的输出包含在AWK代码中。

我相信这可以通过简单的方法来完成,避免使用变量。

文件

12 285000008
12 285000005
12 285000011
12 285000013
12 285000019
12 285000027
12 285000032
14 285235942
14 285235940

我的代码

ft=`sort -k1.7,1.12bn file | head -1 | cut -c 7-12`
lt=`sort -k1.7,1.12bn file | tail -1 | cut -c 7-12`

awk -v fv="$ft" -v lv="$lt" 'BEGIN{
           printf("%s,%s",fv,lv ORS)        
}
{
if($1>12) print "YES", $0 
}' file

所需的输出。

000005,235942
YES 14 285235942
YES 14 285235940

感谢ind

2 个答案:

答案 0 :(得分:1)

此解决方案完全基于仅查看您的尝试和所需的输出,如果您有更多条件,则应让我们在同一时间知道,然后尝试遵循以下操作,该操作将不会创建任何直接处理{{1} }单一代码中的变量。

awk

输出如下。

awk -v min=$(sort -k1.7,1.12bn Input_file | head -1 | cut -c 7-12) -v max=$(sort -k1.7,1.12bn Input_file  | tail -1 | cut -c 7-12)  '
BEGIN{
  print min,max
}
$1>12{
  print "YES",$0
}'  Input_file

答案 1 :(得分:1)

只需使用awk:

$ cat tst.awk
{
    cur = substr($0,7)
    min = ( (NR>1) && (min < cur) ? min : cur )
    max = ( (NR>1) && (max > cur) ? max : cur )
}
$1 > 12 {
    yess[++numYess] = $0
}
END {
    print min "," max
    for (yesNr=1; yesNr<=numYess; yesNr++) {
        print "YES", yess[yesNr]
    }
}

$ awk -f tst.awk file
000005,235942
YES 14 285235942
YES 14 285235940

或者如果您不介意带有排序和管道的2遍方法:

$ cat tst.awk
NR==FNR {
    cur = substr($0,7)
    min = (NR==1 ? cur : min)
    max = cur
    next
}
FNR==1 {
    print min "," max
}
$1 > 12 {
    print "YES", $0
}

$ sort -k1.7n file | awk -f tst.awk - file
000005,235942
YES 14 285235942
YES 14 285235940