文件中数字总和的脚本,这些数字是用文本和特殊字符无空格写入的

2024-10-06 12:38:51 发布

您现在位置:Python中文网/ 问答频道 /正文

假设一个文件

abc[1:0]
2 abc
abc 3
[1:0] abc

我有一个很大的档案。现在,如果我想把所有的数字加起来,如下所示

请注意,不应计算括号外的数字

1+1+numberoflines

在这种情况下,1+1+4=6

我该怎么做

我尝试了很多方法,比如

perl -nle '$sum+=$_} END { print $sum' test1.txt

n=$1
sum=0
sd=0
while [ $n -gt 0 ]
do
    sd=`expr $n % 10`
    sum=`expr $sum + $sd`
    n=`expr $n / 10`
done
echo  "Sum of digit for numner is $sum"

但他们中没有一个是不带空格的数字

请注意,abc只是一个例子。它可以是任何随机文本和数字


Tags: 文件方法情况数字档案sdperl括号
2条回答

使用grep和sed,以下是:

echo $(( $(grep -o '\[.\+\]' test1.txt | sed -e 's/[^0-9]\+/\+/g' -e 's/^\+//g' ; cat test1.txt | wc -l) ))
  1. 使用括号提取行
  2. 将非数字替换为+
  3. 获取文件中的行数
  4. 作为算术表达式计算

如果括号在一行中出现多次,请使用sed而不是grep

echo $(( $(sed -n -e '{s/.*\(\[.\+\]\).*/\1/g;T;p}' test1.txt | sed -e 's/[^0-9]\+/\+/g' -e 's/^\+//g'; cat test1.txt | wc -l) ))

其工作原理如下所述:

echo 'abc[1:0]
2 abc
abc 3
[1:0] abc' | perl -lnE 'while (/\[([^]]*)\]/g) { 
                            $s=$1;
                            while ($s=~/\b(\d+)\b/g) {
                                $sum+=$1;
                            }
                        }   
                        END {
                        say $sum+$.
                        }
'

打印6

要理解它,请在适当的位置插入一些say

echo 'abc[1:0]
2 abc
abc 3
[1:0] abc' | perl -lnE 'while (/\[([^]]*)\]/g) { 
                            $s=$1;
                            say $s;
                            while ($s=~/\b(\d+)\b/g) {
                                say $1;
                                $sum+=$1;
                            }
                        }   
                        END {
                        say $.;
                        say $sum+$.
                        }
'
1:0      first bracketed group from /\[([^]]*)\]/g
1        digits within from $s=~/\b(\d+)\b/g
0
1:0
1
0
4        line count from $.
6        $sum + line count

对于Python解决方案,可以使用相同的正则表达式并执行以下操作:

import re 

total=0
with open(fn) as f:        # 'fn' is the path to your file
    for i, line in enumerate(f, 1):
        if m:=re.findall(r'\[([^]]*)\]', line): 
            for e in m:
                total+=sum(map(int, re.findall(r'\b(\d+)\b', e)))
                
print(total+i)      

这个正则表达式有一些限制:它不会处理不平衡的或嵌套的括号。这是一个更复杂的正则表达式

Python注意:

{}中的{}仅为Python 3.9。 对于早期的Python版本,分成两条语句:

m=re.findall(r'\[([^]]*)\]', line)
if m:
    ...

相关问题 更多 >