[英]Wildcard symbol with grep -F
我有以下文件
0 0
0 0.001
0 0.032
0 0.1241
0 0.2241
0 0.42
0.0142 0
0.0234 0
0.01429 0.01282
0.001 0.224
0.098 0.367
0.129 0
0.123 0.01282
0.149 0.16
0.1345 0.216
0.293 0
0.2439 0.01316
0.2549 0.1316
0.2354 0.5
0.3345 0
0.3456 0.0116
0.3462 0.316
0.3632 0.416
0.429 0
0.42439 0.016
0.4234 0.3
0.5 0
0.5 0.33
0.5 0.5
請注意,這兩列按升序排列,首先是第一列,然后是第二列。 最小值為0,最大值為0.5。
我想算一下行數:
0 0
並將該號碼存儲在名為“ 0_0”的文件中。 在這種情況下,該文件應包含“ 1”。
然后,對於那些是相同的:
0 0.0*
例如,
0 0.032
並將其稱為“ 0_0.0”(應包含“ 2”),並且對於所有組合,僅考慮第一個十進制數字(0 0.1 *,0 0.2 * ... 0.0 * 0、0.0 * 0.0 * ... 0.5 0.5)。
我正在使用此循環:
for i in 0 0.0 0.1 0.2 0.3 0.4 0.5
do
for j in 0 0.0 0.1 0.2 0.3 0.4 0.5
do
grep -F ""$i" "$j"" file | wc -l > "$i"_"$j"
done
done
rm 0_0 #this 0_0 output is badly done, the good way is with the next command, which accepts \n
pcregrep -M "0 0\n" file | wc -l > 0_0
問題是,例如,線
0.0142 0
將不會被迭代“ 0.0 0”識別,因為在“ 0.0”之后有數字。 刪除grep中的-F選項以考慮所有以“ 0.0”開頭的數字將不起作用,因為該點將被視為通配符,因此例如在迭代“ 0.1 0”中,該行
0.0142 0
將被計數,因為0.0142是0“任何” 1。
我希望我能使自己清楚!
有什么辦法可以在grep -F中包含通配符,例如:
for i in 0 0.0 0.1 0.2 0.3 0.4 0.5
do
for j in 0 0.0 0.1 0.2 0.3 0.4 0.5
do
grep -F ""$i"* "$j"*" file | wc -l > "$i"_"$j"
done
done
(請注意grep命令中變量后面的星號)。
謝謝!
不要僅僅使用shell循環來操縱文本,這就是發明shell的人也發明了awk來做的。 請參閱為什么使用shell循環處理文本被認為是不好的做法 。
聽起來您需要做的只是:
awk '{cnt[substr($1,1,3)"_"substr($2,1,3)]++} END{ for (pair in cnt) {print cnt[pair] > pair; close(pair)} }' file
這將比嵌套的shell循環方法效率更高。
這是將輸出到它創建的文件中的內容:
$ awk '{cnt[substr($1,1,3)"_"substr($2,1,3)]++} END{for (pair in cnt) print pair "\t" cnt[pair]}' file
0.0_0.3 1
0_0.4 1
0.5_0 1
0.2_0.5 1
0.4_0.3 1
0.0_0 2
0.1_0.0 1
0.3_0 1
0.1_0.1 1
0.1_0.2 1
0.3_0.0 1
0_0 1
0.1_0 1
0.5_0.3 1
0.4_0 1
0.3_0.3 1
0.2_0.0 1
0_0.0 2
0.5_0.5 1
0.3_0.4 1
0.2_0.1 1
0.0_0.0 1
0_0.1 1
0_0.2 1
0.4_0.0 1
0.2_0 1
0.0_0.2 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.