如何对齐列并反转混乱的生物学表中的最后一个字段

如何对齐列并反转混乱的生物学表中的最后一个字段

我生成了一个表格,但数字弄乱了:

0.967662 0.850492  0.935517 325969
1.071937  0.976805 1.086638      526410.1
0.972091    0.871967     0.950352      306079
1.048607  0.925483  1.008793        412640.1
1.002087       0.888653   0.977475      188199
1.147052  1.029975       1.126825 285331.1
1.062427      0.960176      1.040016 282640.1
1.019481 0.886356 0.974687  980210.1
0.973101  0.857897 0.929414 588859

不仅如此,最后一列的数字还颠倒了。例如,325969.0实际上必须是0.969523.

结果一定是这样的:

0.967662 0.850492 0.935517 969523
1.071937 0.976805 1.086638 1.014625
0.972091 0.871967 0.950352 970603
1.048607 0.925483 1.008793 1.046214
1.002087 0.888653 0.977475 991881
1.147052 1.029975 1.126825 1.133582
1.062427 0.960176 1.040016 1.046282
1.019481 0.886356 0.974687 1.012089
0.973101 0.857897 0.929414 958885

如何解决这个问题?

答案1

perl -lane '$n = reverse pop @F; print join " ", @F, $n' file
0.967662 0.850492 0.935517 969523
1.071937 0.976805 1.086638 1.014625
0.972091 0.871967 0.950352 970603
1.048607 0.925483 1.008793 1.046214
1.002087 0.888653 0.977475 991881
1.147052 1.029975 1.126825 1.133582
1.062427 0.960176 1.040016 1.046282
1.019481 0.886356 0.974687 1.012089
0.973101 0.857897 0.929414 958885

答案2

使用 awk,通过辅助函数来反转一个字段:

function reverse(str) {
  trs=""
  for(i=length(str); i > 0; i--) {
    trs=trs substr(str, i, 1);
  }
  return trs
}
{
  $4=reverse($4);
  print;
}

将其保存到文件中,然后运行:awk -f that-file-above < input > output

根据您的示例输入,结果是:

0.967662 0.850492 0.935517 969523
1.071937 0.976805 1.086638 1.014625
0.972091 0.871967 0.950352 970603
1.048607 0.925483 1.008793 1.046214
1.002087 0.888653 0.977475 991881
1.147052 1.029975 1.126825 1.133582
1.062427 0.960176 1.040016 1.046282
1.019481 0.886356 0.974687 1.012089
0.973101 0.857897 0.929414 958885

答案3

#!/bin/bash
var=$(cat file | column -t | cut -d ' ' -f 7 | rev)

var1=$(cat file | awk '{print $1, $2, $3}')

paste <(echo "$var1") <(echo "$var") --delimiters ' '

注意:这处理您粘贴到问题文本中的数据,这些数据可能与原始文档中的数据不同。请根据您的数据调整列数(在命令awk和中)。cut

相关内容