我要处理数百个文件。每个文件包含数百万行。
示例文件内容:
---------------
12
3
5
---------------
8
0
5
---------------
1
5
56
4
---------------
我需要输出如下所示(由前一个文件中的破折号分隔的数字之和):
20
13
66
我将while
,if
,else
与awk
结合使用,但if
/ else
大大减慢了处理速度。
如何使用纯awk
来加速计算?
答案 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
再次感谢大师!