2017-06-13 129 views
0

我得到了一個有兩列的文件,並且想要在bash中寫一個for循環,該循環從第一列中取出值,將其減去3並將其乘以第二列中的相應值。 然後將所有值一起添加。For循環遍歷一個文件 - 多個條件

的文件看上去例如像這樣:

1 3 
2 5 
7 8 
4 30 

那麼我想一個循環的作用:

1-3 * 3 
+ 2-3*5 
+ 7-3*8 
+ 4-3*30 

我已經一個for循環看起來像這樣:

for (p in $(awk '{ print $1; }' file.txt) 

do 

    total=$(echo $total+($p-3) | bc) 
    ((count++)) 
done 

    echo " $total" | bc > file2.txt 

這有效。但是我能做些什麼來包含與文件另一列的乘法?

以下想法行不通:

for (p in $(awk '{ print $1; }' file.txt) && k in $(awk '{ print $2; }'  file.txt)). 
+0

'的awk「{總+ =($ 1 - 3 )* $ 2} END {print total}'file.txt' – Phylogenesis

+0

如果您不使用圓括號,說明與計算不匹配...'(1-3)* 3!= 1-3 * 3' – karakfa

+0

當然是的;) – Dontwastetime

回答

1
awk '{ sum += $2*($1-3); } END{ print sum; }' <input file> 
+0

謝謝!但是我能做些什麼來進行更復雜的積分迭代。如果我想乘以xi + 1 -xi * yi。 – Dontwastetime

+0

我的意思是我需要更多的專欄。我能做一些能夠保持我的版本的foor循環但包含另一個條件的東西嗎? – Dontwastetime

+0

當然,只需在awk腳本中添加另一個命令即可。你的循環版本真的不是一個好的方法。這些類型的問題是awk設計要處理的問題。 https://edm00se.io/assets/images/post_images/right-tool-for-job-jekyll/scottySays.jpg – Jack

0

你已經拿到完全有效awkanswer。但是,如果你喜歡使用bash,只要你在整數只能操作,您可以在bash做的這一切,而不需要生成awkbc

#!/bin/bash 
sum=0 
while read a b; do 
    ((sum=sum+(a-3)*b)) 
done < file.txt 
echo $sum 
+0

應該是'(a-3)* b'​​ – karakfa

+0

@karakfa對。我看過例子而不是描述。固定。 – ArturFH