我是一個缺乏經驗的 Awk 用戶,但我知道 Awk 是處理許多檔案的有效選擇。如果有人能指出我正確的方向,我將不勝感激。
我有一個名為parent. 里面有更多名為1, 2, 3, 4, .... 在每個目錄中都有一個名為angles. 里面angles是一個名為 的檔案angle_A_B_C.dat,如下所示。
parent
1
angles
angle_A_B_C.dat
2
angles
angle_A_B_C.dat
3
angles
angle_A_B_C.dat
4
angles
angle_A_B_C.dat
...
這些檔案angle_A_B_C.dat都具有相同的行數 (91) 和相同的第一列。只有第二列中的值是不同的。以下是一個angle_A_B_C.dat檔案的示例:
# Deg[°] Angle[A ,B ,C ]
1.000 0.0000000000
3.000 0.0000000000
5.000 0.0000000000
7.000 0.0000000000
9.000 0.0000000000
11.000 0.0000000000
13.000 0.0000000000
15.000 0.0000000000
17.000 0.0000000000
19.000 0.0000000000
21.000 0.0000000000
23.000 0.0000000000
25.000 0.0000000000
27.000 0.0000000000
29.000 0.0000000000
31.000 0.0000000000
33.000 0.0000000000
35.000 0.0000000000
37.000 0.0000000000
39.000 0.0000000000
41.000 0.0000000000
43.000 0.0000000000
45.000 0.0000000000
47.000 0.0000000000
49.000 0.0000000000
51.000 0.0000000000
53.000 0.0000000000
55.000 0.0000000000
57.000 0.0000000000
59.000 0.0000000000
61.000 0.0000000000
63.000 0.0000000000
65.000 0.0000000000
67.000 1.0309278351
69.000 1.0309278351
71.000 2.0618556701
73.000 1.0309278351
75.000 2.0618556701
77.000 0.0000000000
79.000 0.0000000000
81.000 4.1237113402
83.000 2.0618556701
85.000 4.1237113402
87.000 2.0618556701
89.000 2.0618556701
91.000 5.1546391753
93.000 3.0927835052
95.000 1.0309278351
97.000 3.0927835052
99.000 1.0309278351
101.000 2.0618556701
103.000 9.2783505155
105.000 7.2164948454
107.000 4.1237113402
109.000 5.1546391753
111.000 5.1546391753
113.000 3.0927835052
115.000 2.0618556701
117.000 9.2783505155
119.000 0.0000000000
121.000 3.0927835052
123.000 3.0927835052
125.000 2.0618556701
127.000 0.0000000000
129.000 1.0309278351
131.000 1.0309278351
133.000 2.0618556701
135.000 1.0309278351
137.000 0.0000000000
139.000 1.0309278351
141.000 0.0000000000
143.000 0.0000000000
145.000 1.0309278351
147.000 0.0000000000
149.000 0.0000000000
151.000 1.0309278351
153.000 0.0000000000
155.000 0.0000000000
157.000 1.0309278351
159.000 0.0000000000
161.000 0.0000000000
163.000 0.0000000000
165.000 0.0000000000
167.000 0.0000000000
169.000 0.0000000000
171.000 0.0000000000
173.000 0.0000000000
175.000 0.0000000000
177.000 0.0000000000
179.000 0.0000000000
我想生成一個名為的檔案anglesSummary.txt,其中第一列與上面示例中的所有angle_A_B_C.dat檔案相同,并且第二列的每一行是所有其他檔案中同一行的平均值。
我大致記得如何取位于不同目錄中不同檔案中的整個列的平均值,但不知道如何一次只處理一行。這可能嗎?
這是我現在的位置;問號顯示我認為我被困在哪里。
cd parent
find . -name angle_A_B_C.dat -exec grep "Angle[A ,B ,C ]" {} > anglesSummary.txt
my_output="$(awk '{ total = ??? } END { print total/NR }' anglesSummary.txt)"
echo "Average: $my_output" >> anglesSummary.txt
更新(回應 markp-fuso 評論)
我想要什么(請參閱第 1 列值為 15.000 的行的注釋):
# Deg[°] Angle[A ,B ,C ]
1.000 0.0000000000
3.000 0.0000000000
5.000 0.0000000000
7.000 0.0000000000
9.000 0.0000000000
11.000 0.0000000000
13.000 0.0000000000
15.000 1.2222220000 # <--Each row in column 2 is the average of the value in the corresponding row, column 2 in all files. So this particular value (1.222222) is the average of the values in all files where the column 1 value is 15.000.
17.000 0.0000000000
19.000 0.0000000000
21.000 0.0000000000
23.000 0.0000000000
25.000 0.0000000000
27.000 0.0000000000
29.000 0.0000000000
31.000 0.0000000000
33.000 0.0000000000
35.000 0.0000000000
... (truncated)
我目前從我的代碼中得到的是每個 angle_A_B_C.dat 檔案中第 2 列平均值的平均值。
如果這仍然不清楚,請隨時說出來,我會重寫它。謝謝你。
uj5u.com熱心網友回復:
樣本輸入:
$ head */*/angle*
==> 1/angles/angle_A_B_C.dat <==
# Deg[°] Angle[A ,B ,C ]
1.000 0.3450000000
3.000 0.4560000000
5.000 0.7890000000
7.000 10.0000000000
9.000 20.0000000000
11.000 30.0000000000
13.000 40.0000000000
==> 2/angles/angle_A_B_C.dat <==
# Deg[°] Angle[A ,B ,C ]
1.000 7.3450000000
3.000 8.4560000000
5.000 9.7890000000
7.000 17.0000000000
9.000 27.0000000000
11.000 37.0000000000
13.000 47.0000000000
==> 3/angles/angle_A_B_C.dat <==
# Deg[°] Angle[A ,B ,C ]
1.000 0.9876000000
3.000 0.5432000000
5.000 0.2344560000
7.000 3.0000000000
9.000 4.0000000000
11.000 5.0000000000
13.000 6.0000000000
一個GNU awk想法:
find . -name angle_A_B_C.dat -type f -exec awk '
NR==1 { printf "%s\t%s\n","# Deg[°]", "Angle[A ,B ,C ]" } # 1st record of 1st file => print header
FNR==1 { filecount ; next } # 1st record of each new file => increment file counter; skip to next input line
NF==2 { sums[$1] =$2 } # sum up angles, use 1st column as array index
END { if (filecount>0) { # eliminate "divide by zero" error if no files found
PROCINFO["sorted_in"]="@ind_num_asc" # sort array by numeric index in ascending order
for (i in sums) # loop through array indices, printing index and average
printf "%.3f\t%.10f\n", i, sums[i]/filecount
}
}
' {}
筆記:
GNU awk需要PROCINFO["sorted_in"]允許以# Deg[°]升序生成輸出(否則輸出可以通過管道傳輸sort以確保所需的順序)
假設輸入行已經排序:
find . -name angle_A_B_C.dat -type f -exec awk '
NR==1 { printf "%s\t%s\n","# Deg[°]", "Angle[A ,B ,C ]" }
FNR==1 { filecount ; next }
NF==2 { col1[FNR]=$1; sums[FNR] =$2 }
END { if (filecount>0)
for (i=2;i<=FNR;i )
printf "%.3f\t%.10f\n", col1[i], sums[i]/filecount
}
' {}
筆記:
- 應該在所有
awk版本中運行(即不需要GNU awk) - 基于 jhnc 的評論(如果 jhnc 想發布單獨的答案,我可以洗掉這部分答案)
這兩個生成:
# Deg[°] Angle[A ,B ,C ]
1.000 2.8925333333
3.000 3.1517333333
5.000 3.6041520000
7.000 10.0000000000
9.000 17.0000000000
11.000 24.0000000000
13.000 31.0000000000
筆記:
printf通過修改格式字串,可以根據 OP 的喜好調整輸出格式
uj5u.com熱心網友回復:
使用連接輸入檔案的合成版本進行測驗212 MB,假設有一點 over 76,000 individual files,并完成整個報告2.23 seconds
該解決方案旨在通過將中間值存盤為無符號整數2^53而不是雙精度浮點數來最小化舍入誤差,并使用最昂貴的字串操作來防止不希望的預轉換為浮點數。
它還使用蠻力方法來規避某些awk缺乏內置排序功能的 s 的限制。好處是 - 輸入檔案中的行可以是任何混亂的順序,這很好。
pvE0 < test.txt \
\
| mawk2 '
BEGIN {____=\
_^=_=(_ = _ _)^--_ --_;_____=!(_=!_)
} {
if (/Deg/) { ___[$_] } else {
___[$_____]=$_
__[$_____] =____*int(______=$NF) \
substr(______,index(______,".") _____)
} } END {
for(_ in ___) { if(index(_,"Deg")) {
______=___[_]
print _
break } }
_________=match(________=sprintf("%.*s",\
index(____,!____),____),/$/)
for(_=_~_;_-________<=(_________ ________)*\
(_________ ________);_ ) {
if((_______=sprintf("%.*f",_________,_)) in __) {
_____=___[_______]
sub("[ \t]*[[:digit:]] [.][[:digit:]] $",
sprintf("%c%*.*f",--________, ________ _________,
________,__[_______]/______/____),_____)
print _____ } } }'
in0: 212MiB 0:00:02 [97.1MiB/s] [97.1MiB/s]
[=============================>] 100%
# Deg[°] Angle[A ,B ,C ]
1.000 7.5148221018
3.000 7.4967176419
5.000 7.5160005498
7.000 7.4793862628
9.000 7.5123479596
11.000 7.4791082935
13.000 7.4858962001
15.000 7.4941294148
17.000 7.5150168021
19.000 7.5067556155
21.000 7.5146136198
23.000 7.4792701433
25.000 7.4801382861
27.000 7.5026906476
29.000 7.4802267331
31.000 7.5216754387
33.000 7.4892379481
35.000 7.4905661773
37.000 7.4759338641
39.000 7.5130521094
41.000 7.4923359448
43.000 7.4680275394
45.000 7.5131741424
47.000 7.5022641880
49.000 7.4865545672
51.000 7.5280509182
53.000 7.4982720538
55.000 7.5082048446
57.000 7.5034726853
59.000 7.4978429619
61.000 7.5055566807
63.000 7.5108651984
65.000 7.5211276535
67.000 7.4875763176
69.000 7.4993074644
71.000 7.5124084003
73.000 7.5321662989
75.000 7.4859560680
77.000 7.4700932217
79.000 7.5121024268
81.000 7.5180572994
83.000 7.4938736294
85.000 7.5073566749
87.000 7.4917927829
89.000 7.5142626391
91.000 7.5223228551
93.000 7.5168014947
95.000 7.4757822101
97.000 7.5141328593
99.000 7.4863544344
101.000 7.5036731671
103.000 7.5200733708
105.000 7.4964541138
107.000 7.5050440318
109.000 7.4890049434
111.000 7.5045965882
113.000 7.5119613957
115.000 7.5050971735
117.000 7.4983417123
119.000 7.4867090870
121.000 7.5047947039
123.000 7.4837043078
125.000 7.4995212486
127.000 7.5111280706
129.000 7.5092771858
131.000 7.4977679060
133.000 7.5278372066
135.000 7.4794945181
137.000 7.5152681775
139.000 7.4954245649
141.000 7.5099441844
143.000 7.4945221883
145.000 7.4860083947
147.000 7.4848234307
149.000 7.4932545468
151.000 7.4937942058
153.000 7.4657789265
155.000 7.4947049961
157.000 7.5113607827
159.000 7.4978364461
161.000 7.5031970850
163.000 7.5017955073
165.000 7.5187543102
167.000 7.5064268609
169.000 7.4985988429
171.000 7.5438396243
173.000 7.4917706435
175.000 7.4589904950
177.000 7.5072644989
179.000 7.5176241959
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458917.html
上一篇:洗掉Python中的所有空字符
