【问题标题】:Get the max and min values from each row (unix)从每一行获取最大值和最小值(unix)
【发布时间】:2020-07-13 14:35:59
【问题描述】:

我有一个由多列和多行分隔的数据集选项卡:

ID      v1    v2     v3     v4     v5    v6     v7     v8     
CR_A    2.0657669  1.8515346 2.0644004   0.58573062  2.4229691  1.0294456   1.640186   4.1076807
LR_57   0.83709141 1.097222  1.1135779   0.84598841  1.4768965  0.82643804  1.8255887  2.9050872
CR_t1t  1.3008098  1.0157919 0.76411066 -0.56374447  1.4978799  0.016129955 1.7124357  2.4607684

我想要每行的最小值和最大值。例如:

CR_A     0.58573062  4.1076807
LR_57    0.84598841  2.9050872
CR_t1t   -0.56374447 2.4607684

我只能计算最小值:

cat file | grep -v ID | awk '{for (i=1;i<=NF;i++) {$1=($i<$1)?$i:$1} print $1}'

有什么建议吗?

【问题讨论】:

  • 我认为覆盖现有数据不是一个好主意,就像您正在做的那样$1=(...)。为什么不直接使用单独的变量,如 minmax 并与它们进行比较?这在max 方面有点棘手,但这将是一个有趣的编程问题供您解决。此外,您可以通过采用awk '$0 !~/^ID/{..code}' file 形式来减少使用的进程数,祝您好运。

标签: unix max min


【解决方案1】:

我会将所有内容放入一个新文件中

awk  'NR>1{a=0; b=0; for (i=1;i<=NF;i++) if ($i < a || i == 1)a = $i; else if($i > b|| i == 1)b = $i; print $1,a, b}' test.txt > new_file2

NR>1 跳过作为列名的第一行。遍历每一行,保存最大值和最小值并打印名称、最小值和最大值。希望对您有所帮助。

我的输出。你上面想要的输出是错误的,因为 CR_t1t 行的最小值不是你写的 1.7.1234,而是实际上是 2.4607684。

CR_A 0.58573062 4.1076807
LR_57 0.82643804 2.9050872
CR_t1t -0.56374447 2.4607684
D10 -0.4515 2.2971

【讨论】:

  • 感谢您的建议。此代码给出了正确的最小值,但最大值不正确...
  • 检查编辑,我认为你写的输出对于第三行最大值有错误的值,应该是 2.4607684
  • 你是对的,我编辑了这个问题。我正在将您的代码用于我拥有的另一个类似数据集,所以我不确定为什么不起作用。
  • 我能看到数据集吗?
  • 唯一的区别是我有更多的列,例如1行:D10 0.7552 -0.3039 0.2974 2.2971 0.3155 -0.4515 0.0050 1.5315 1.2750 2.4316 1.4391 0.1278
猜你喜欢
  • 2015-01-09
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多