![如何找到一列值的最小值/最大值并将该值添加到所有列号中?](https://linux22.com/image/99145/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E4%B8%80%E5%88%97%E5%80%BC%E7%9A%84%E6%9C%80%E5%B0%8F%E5%80%BC%2F%E6%9C%80%E5%A4%A7%E5%80%BC%E5%B9%B6%E5%B0%86%E8%AF%A5%E5%80%BC%E6%B7%BB%E5%8A%A0%E5%88%B0%E6%89%80%E6%9C%89%E5%88%97%E5%8F%B7%E4%B8%AD%EF%BC%9F.png)
我似乎无法找到此 awk 命令的正确语法来查找一列值的最小值和最大值,并将 ( -1*min
) 值添加到所有列值(有效地将我的数据归零)。将不胜感激任何帮助!非常感谢!
awk 'NR==1 {max=$2; min=$2} $2>=max {max=$2} $2<=min {min=$2}' < my_data.dat | awk '{printf("%-5d%+13.5f \n", NR, $2+(-1*min))}' > my_new_data.dat
答案1
您可以使用与多个文件相同的语法来浏览一个文件两次,并且只需使用同一文件两次。
awk 'NR==1 { max=$1 ; min=$1 }
FNR==NR { if ($1>=max) max=$1 ; $1<=min?min=$1:0 ; next}
{ $2=($1-min)/(max-min) ; print }' file file
详细解释:
NR==1 { max=$1 ; min=$1 }
- 采用第一条记录的值,你已经这样做了
FNR==NR
-awk
对于多个输入文件,将具有NR
总体记录索引号的值(即,就好像所有文件都连接起来一样)和FNR
当前文件的记录索引号的值。如果这些匹配,我们正在处理第一个文件,即仅对第一个文件执行此块。
if ($1>=max) max=$1
-awk
的if
语句语法是if (condition) action ; else if (condition) action ; else action
.显然if else
和else
语句是可选的。
$1<=min?min=$1:0
- 和替代if
语句语法:condition?yes-action:no-action
.这需要其他行动,因此毫无意义0
。只为你的兴趣。
next
- 跳到下一个文件,以便仅对第二个文件执行以下块。
$2=($1-min)/(max-min) ; print
- 对 [0,1] 进行标准化(在您的示例中没有用处,max
所以我用它代替......)并打印数据。