任何人都可以给我一些代码或算法或其他东西来解决以下问题吗? 我有几个文件,每个文件都有不同的列数,例如:
$> cat file-1
1 2
$> cat file-2
1 2 3
$> cat file-3
1 2 3 4
我想减去列绝对值,并除以每个不同列的行中所有行的总和一次(没有重复列对的组合):
in file-1 case I need to get:
0.3333 # because |1-2/(1+2)|
in file-2 case I need to get:
0.1666 0.1666 0.3333 # because |1-2/(1+2+3)| and |2-3/(1+2+3)| and |1-3/(1+2+3)|
in file-3 case I need to get:
0.1 0.2 0.3 0.1 0.2 0.1 # because |1-2/(1+2+3+4)| and |1-3/(1+2+3+4)| and |1-4/(1+2+3+4)| and |2-3/(1+2+3+4)| and |2-4/(1+2+3+4)| and |3-4/(1+2+3+4)|
答案 0 :(得分:3)
虽然我猜你在输入数据中犯了一个小错误,但这应该可行。根据您的第三种模式,以下数据应为 -
in file-2 case I need to get:
0.1666 0.1666 0.3333 # because |1-2/(1+2+3)| and |2-3/(1+2+3)| and |1-3/(1+2+3)|
in file-2 case I need to get:
0.1666 0.3333 0.1666 # because |1-2/(1+2+3)| and |1-3/(1+2+3)| and |2-3/(1+2+3)|
以下是awk
一个班轮:
awk '
NF{
a=0;
for(i=1;i<=NF;i++)
a+=$i;
for(j=1;j<=NF;j++)
{
for(k=j;k<NF;k++)
printf("%s ",-($j-$(k+1))/a)
}
print "";
next;
}1' file
awk '
NF{for (i=1;i<=NF;i++) a+=$i;
for (j=1;j<=NF;j++){for (k=j;k<NF;k++) printf("%2.4f ",-($j-$(k+1))/a)}
print "";a=0;next;}1' file
[jaypal:~/Temp] cat file
1 2
1 2 3
1 2 3 4
[jaypal:~/Temp] awk '
NF{
a=0;
for(i=1;i<=NF;i++)
a+=$i;
for(j=1;j<=NF;j++)
{
for(k=j;k<NF;k++)
printf("%s ",-($j-$(k+1))/a)
}
print "";
next;
}1' file
0.333333
0.166667 0.333333 0.166667
0.1 0.2 0.3 0.1 0.2 0.1
[jaypal:~/Temp] awk '
NF{for (i=1;i<=NF;i++) a+=$i;
for (j=1;j<=NF;j++){for (k=j;k<NF;k++) printf("%2.4f ",-($j-$(k+1))/a)}
print "";a=0;next;}1' file
0.3333
0.1667 0.3333 0.1667
0.1000 0.2000 0.3000 0.1000 0.2000 0.1000
答案 1 :(得分:1)
@Jaypal也打败了我!这就是我所拥有的:
awk '{for (x=1;x<=NF;x++) sum += $x; for (i=1;i<=NF;i++) for (j=2;j<=NF;j++) if (i < j) printf ("%.1f ",-($i-$j)/sum)} END {print ""}' file.txt
输出:
0.1 0.2 0.3 0.1 0.2 0.1
打印到一个小数位。
@Jaypal,有一种快速的方法来打印绝对值吗?或许像:abs(value)
?
编辑:
@Jaypal,是的,我也尝试过搜索并找不到简单的东西:-(似乎if ($i < 0) $i = -$i
是要走的路。我猜你可以使用sed
删除任何减号体征:
awk '{for (x=1;x<=NF;x++) sum += $x; for (i=1;i<=NF;i++) for (j=2;j<=NF;j++) if (i < j) printf ("%.1f ", ($i-$j)/sum)} {print ""}' file.txt | sed "s%-%%g"
干杯!
答案 2 :(得分:0)
因为它看起来像是一个家庭作业,我会采取相应的行动。
要查找文件中的总数,您可以使用
cat filename | wc -w
按以下方式查找first_number:
cat filename | cut -d " " -f 1
要在文件中查找总和:
cat filename | tr " " "+" | bc
现在,你有total_nos,使用类似的东西:
for i in {seq 1 1 $total_nos}
do
#Find the numerator by first_number - $i
#Use the sum you got from above to get the desired value.
done