目的是从输出文件第一行的字符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
答案 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