如何找到一列值的最小值/最大值并将该值添加到所有列号中?

如何找到一列值的最小值/最大值并将该值添加到所有列号中?

我似乎无法找到此 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-awkif语句语法是if (condition) action ; else if (condition) action ; else action.显然if elseelse语句是可选的。

$1<=min?min=$1:0- 和替代if语句语法:condition?yes-action:no-action.这需要其他行动,因此毫无意义0。只为你的兴趣。

next- 跳到下一个文件,以便仅对第二个文件执行以下块。

$2=($1-min)/(max-min) ; print- 对 [0,1] 进行标准化(在您的示例中没有用处,max所以我用它代替......)并打印数据。

相关内容