【问题标题】:How to divide column subsequently by all other columns or divide it by the multiple of all the other columns?如何随后将列除以所有其他列或将其除以所有其他列的倍数?
【发布时间】:2016-11-23 11:03:47
【问题描述】:

谁能帮我解决以下问题:
我有一个制表符分隔的文件,每行的列数不同。我需要随后将第一列中的值除以所有其他列中的值。因此,我想将最终编号添加到新文件中。

example_file.txt

0.0002  0.2    0.2    0.6   
0.03    0.3    0.7     
0.004   0.1    0.2    0.005   0.3  0.005  

我用 1 填充所有空行,以避免除以 0 的问题:

awk '{for(i=NF+1;i<=6;i++)$i="1"}1' < example_file.txt > example_file_filled.txt

example_file_filled.txt

0.002   0.2   0.2      0.6    1   1    
0.03    0.3   0.7        1    1   1    
0.004   0.1   0.2    0.005    0.3 0.005    

预期输出:

输出.txt

0.083  
0.14  
26666.66  

我知道我可以:
- 将第一列除以第二列,然后取此值并除以第三列等。
- 或者将第二列到最后一列的所有列相乘,然后使用该值除以第一列

对于我尝试使用的第一种可能性:

awk '{$1=$1/$2; $2=""; print $0 }' example_file_filled.txt 

这将第一行除以第二行,并将结果打印为输出,后面是尚未用于除法的数字。我试图循环它以完成它,直到没有第二行,但我没有成功。

有人可以提出解决方案吗?我的真实文件有 >100 列。我主要使用 bash / unix,但我也很乐意向其他方法学习。
提前致谢!

【问题讨论】:

    标签: bash unix awk


    【解决方案1】:

    使用循环遍历其他列,然后除:

    awk '{ val = 1; for (i = 2; i <= NF; ++i) val *= $i; print $1 / val }' file
    

    或者只是做连续的除法,再次循环:

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

    如何处理任何列中存在0 由您决定 - 如果您愿意,可以在执行除法之前添加if

    【讨论】:

    • 非常感谢!它完美地工作。我在任何一列中都没有 0,所以没关系。
    【解决方案2】:

    perl

    $ cat ip.txt 
    0.002  0.2    0.2    0.6   
    0.03    0.3    0.7     
    0.004   0.1    0.2    0.005   0.3  0.005  
    
    $ perl -lane '$a=$F[0]; $a /= $_ foreach (@F[1..$#F]); print $a' ip.txt 
    0.0833333333333333
    0.142857142857143
    26666.6666666667
    

    限制小数点:

    $ perl -lane '$a=$F[0]; $a /= $_ foreach (@F[1..$#F]); printf "%.3f\n", $a' ip.txt 
    0.083
    0.143
    26666.667
    


    有关perl 命令行选项的说明,请参阅Perl flags -pe, -pi, -p, -w, -d, -i, -t?

    【讨论】:

    • 感谢 perl 版本!很遗憾,我只能接受一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2019-02-02
    • 2020-04-08
    相关资源
    最近更新 更多