2016-11-23 54 views
2

任何人都可以帮助我解决以下问题:
我有一个制表符分隔的文件,在每一行中没有相同数量的列。我需要将第一列中的值随后除以所有其他列中的值。因此,我希望将最终号码提供给一个新文件。如何将所有其他列的列随后分割或除以所有其他列的倍数?

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  

预期输出:

output.txt的

0.083 
0.14 
26666.66 

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

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

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

这除以第二个和打印作为输出的结果,接着为尚未用于划分这些数字中的第一行。我试图循环完成,直到没有第二行,但我没有管理。

任何人都可以提出解决方案吗?我的真实文件有> 100列。我主要使用bash/unix,但我也乐于从其他方法中学习。
在此先感谢!

回答

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

非常感谢!它完美的作品。我没有任何专栏中的0,所以没关系。 –

0

随着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?

+0

感谢perl版本!不幸的是我只能接受一个答案。 –

相关问题