如何在bash中将列除以常量

时间:2018-03-28 15:33:05

标签: bash shell unix dataframe awk

我的表格看起来像这样:

ERR843978.746 15 54 71
ERR843978.1705 7 45 51
ERR843978.5030 3 46 58
ERR843978.8855 15 48 52
ERR843978.4162 16 48 64
ERR843978.421 14 51 54
ERR843978.4599 12 60 46
ERR843978.5941 18 67 55
ERR843978.3780 15 56 70

我希望将所有列预期第一个列相同的数字,例如如果我除以3得到这种输出,例如:

ERR843978.746 3 18 23.666
ERR843978.1705 2.333 15 17
ERR843978.5030 1 15.333 19.333
ERR843978.8855 5 19.333 17.333
...

这听起来并不太难但我无法想出用bash做到这一点的方法(我猜你也可以用Python轻松做到这一点)。

我需要一个不太慢的解决方案,因为我的桌子实际上非常大。

3 个答案:

答案 0 :(得分:2)

在awk中:

$ awk '{for(i=2;i<=NF;i++)$i/=3}1' file
ERR843978.746 5 18 23.6667
ERR843978.1705 2.33333 15 17
ERR843978.5030 1 15.3333 19.3333
ERR843978.8855 5 16 17.3333
ERR843978.4162 5.33333 16 21.3333
ERR843978.421 4.66667 17 18
ERR843978.4599 4 20 15.3333

将其传输到column以获取nices输出:

$ awk ... | column -t
ERR843978.746   5        18       23.6667
ERR843978.1705  2.33333  15       17
ERR843978.5030  1        15.3333  19.3333

答案 1 :(得分:2)

关注awk可能对您有帮助。

awk '{for(i=2;i<=NF;i++){$i=$i/3}} 1'  Input_file

答案 2 :(得分:1)

Perl解决方案:

perl -ane '$_ /= 3 for @F[1..$#F]; print "@F\n"' -- file
  • -n逐行读取输入行
  • -a拆分空格上的每一行并填充@F数组
  • $_ /= 3$_ = $_ / 3
  • 的简写