2017-06-13 93 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