大文件的awk和sum行

时间:2016-06-07 23:42:15

标签: file if-statement awk

我要处理数百个文件。每个文件包含数百万行。

示例文件内容:

---------------
12
3
5
---------------
8
0
5
---------------
1
5
56
4
---------------

我需要输出如下所示(由前一个文件中的破折号分隔的数字之和):

20
13
66

我将whileifelseawk结合使用,但if / else大大减慢了处理速度。

如何使用纯awk来加速计算?

4 个答案:

答案 0 :(得分:3)

你不需要if / else块,

$ awk 'FNR>1 && /^----/ {print sum; sum=0; next} {sum+=$1}' file{1,2} 
20
13
66
20
13
66

例如输入file1和file2的副本。也许你会一次一个地运行它们,或者在总和之前为多个输入运行一个前缀,例如

$ awk 'FNR==1{block=0} FNR>1 && /^----/ {print FILENAME, ++block, sum; sum=0; next} 
                                        {sum+=$1}' file{1,2} 

file1 1 20
file1 2 13
file1 3 66
file2 1 20
file2 2 13
file2 3 66

答案 1 :(得分:3)

$ awk '/^-+$/{if (s!="") print s; s=""; next} {s+=$0}' file
20
13
66

注意设置/比较s到""以区别对待它,如果它是一个总和值零而刚刚初始化为空字符串。

答案 2 :(得分:2)

另一种选择。我很好奇它是如何快速加速的

awk -v RS='\n-+\n' -F'\n' 'NF {s=0; for(i=1; i<=NF; i++) s+=$i; print s}' file ...

答案 3 :(得分:-1)

感谢大家花时间帮助我!与while / if条件相比,你的awk示例非常快。感谢链接也描述了原因。似乎我创建了我能写的最糟糕的代码版本: - /

我的代码版本也可以正常运行,但速度非常慢:

    Private Sub CommandButton1_Click()

Dim rgTarget As Range
Dim RowI As Long, ColumnI As Long

    Folderpath = "C:\Users\sandeep.hc\Pics"
    Set fso = CreateObject("Scripting.FileSystemObject")
    NoOfFiles = fso.GetFolder(Folderpath).Files.Count
    Set listfiles = fso.GetFolder(Folderpath).Files
    For Each fls In listfiles
       strCompFilePath = Folderpath & "\" & Trim(fls.Name)
        If strCompFilePath <> "" Then
            If (InStr(1, strCompFilePath, "jpg", vbTextCompare) > 1 _
            Or InStr(1, strCompFilePath, "jpeg", vbTextCompare) > 1 _
            Or InStr(1, strCompFilePath, "png", vbTextCompare) > 1) Then
    RowI = 29
    ColumnI = ColumnI + 1
    Set rgTarget = Cells(RowI, ColumnI)
    Application.ActiveSheet.Shapes.Addpicture strCompFilePath, False, True, rgTarget.Left, rgTarget.Top, 875, 400
    ColumnI = ColumnI + 17
    End If

End If
Next

End Sub

再次感谢大师!