2016-11-23 91 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版本!不幸的是我只能接受一個答案。 –

相關問題