簡體   English   中英

帶grep -F的通配符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM