我想编写一个 shell 脚本程序,给出给定文件奇数行和偶数行中偶数和奇数的总和。
我想使用:
sed -n 2~2p
和
sed -n 1~2p
但我什至不知道从哪里以及如何开始解决它。您能引导我走向正确的方向吗?
输入文件示例:
20 15 14 17
20 50 79 77
55 40 89 77
45 65 87 12
输出示例:
Odd summ: 15+17+55+89+77=253(Enough just the end of the summ)
Even summ: 20+50+12=82(Enough just the end of the summ)
答案1
使用米勒(https://github.com/johnkerl/miller)并运行
mlr --n2c put 'for (key, value in $*) {
if ((value % 2 ==0) && (NR % 2 ==0)) {
$even +=value;
} elif ((value % 2 !=0) && (NR % 2 !=0)) {
$odd +=value;
}
}
' then unsparsify then stats1 -a sum -f odd,even input.csv
你将会拥有
odd_sum,even_sum
253,82
答案2
和perl
:
perl -lne '$odd = $. & 1; $sum[$odd] += $_ for grep {($_ & 1) == $odd} /\d+/g;
END {
print "Sum of odd numbers on odd lines: " . (0+$sum[1]);
print "Sum of even numbers on even lines: " . (0+$sum[0]);
}' < file
(这里只考虑输入中的十进制数字序列,如果您还想考虑负数或十六进制、八进制数字,您可能需要进行调整......)
在您的示例输入中,它给出:
Sum of odd numbers on odd lines: 253
Sum of even numbers on even lines: 82
对于您的全部预期输出:
perl -MList::Util=sum -lne '
$odd = $. & 1;
push @{$l[$odd]}, grep {($_ & 1) == $odd} /\d+/g;
END {
$" = "+";
print "Odd sum: @{$l[1]}=" . sum(@{$l[1]});
print "Even sum: @{$l[0]}=" . sum(@{$l[0]});
}' < file
请注意,您的sed -n 2~2p
和sed -n 1~2p
是 GNU 扩展。标准等效项分别是:sed 'n;d'
和sed '1d;n;d'
。
答案3
或者,因为只有奇数(行或值)+偶数(值或行)=奇数(测试输出)...
awk '{
for (i=1;i<=NF;i++)
{if (($i+NR)%2==0) {if ($i%2==0) {
seven+=$i; even=even "+" $i} else {sodd+=$i; odd=odd "+" $i} }
}
} END {
print "Evens:", substr(even,2,length(even)-1) "=" seven;
print "Odds:", substr(odd,2,length(odd)-1) "=" sodd;
}' file
输出
Evens: 20+50+12=82
Odds: 15+17+55+89+77=253
答案4
我们可以将一切都转化为数学。在大多数语言中var%2
只有两个可能的值,要么0
要么1
。如果我们可以将它们用作数字来相乘,我们可以这样做(例如在 awk 中):
(f%2) * f
f
如果该值为奇数,则为 (field) 的值,0
否则为奇数。
所以,在 awk 中,这就足够了:
awk '{
for(f=1;f<=NF;f++){
so += (NR%2) * ($f%2) * $f;
se += !(NR%2) * !($f%2) * $f
}
}END{
print(so,se)
}
' filetotest
其中NR
是记录号,f
是字段号。