4 个版本
0.1.3 | 2020 年 8 月 15 日 |
---|---|
0.1.2 | 2020 年 8 月 12 日 |
0.1.1 | 2020 年 8 月 11 日 |
0.1.0 | 2020 年 8 月 11 日 |
39 在 #proposal
145KB
1K SLoC
小布尔
安装
cargo install smlr
帮助
这是 smlr v0.1.3
的文档。调用 smlr --help
将显示可用的选项
smlr 0.1.3
Wilfried Kopp <chevdor@gmail.com>
Find similar lines in a file or stdin.
USAGE:
smlr [FLAGS] [OPTIONS] [FILE]
FLAGS:
--case-sensitive Weather the checks consider the case or not
-c, --count Show the number of occurences
--debug Debug mode, slower
-f, --full Set the score to the max
--help Prints help information
-h, --headers Show the headers
-b, --ignore-spaces Ignore spaces
-i, --invert Invert the result
-l, --line-numbers How many of the next lines are considered in the match. A larger value requires more
processing.
--no-index Prevent saving index to disk
--strict = Max distance = 0
-V, --version Prints version information
-v, --verbose Sets the level of verbosity
OPTIONS:
--algo <algo>
Algo used to calculate the distance [default: Levenshtein] [possible values: Levenshtein,
DamerauLevenshtein]
-d, --distance <distance> The max distance [default: 3]
--persistence-folder <persistence-folder>
Location where the persistence files will be stored if the mode is custom [default: temp]
--persistence-mode <persistence-mode>
Location where the persistence files will be stored. In 'beside' mode, the current folder will be used.
[default: temp] [possible values: temp, custom, beside]
-s <scope>
How many of the next lines are considered in the match. A larger value requires more processing. [default:
10]
ARGS:
<FILE> Sets the input file to use. Alternatively, you may pipe <stdin>.
rustdoc 可以在这里找到 这里。
概览
smlr
是一个命令行实用程序,可帮助您在文本数据中找到 相似的 条目。它并不旨在取代 uniq
或 awk
等工具。
以下数据在 samples
文件夹中可用。让我们考虑一些示例
性能
在我的 iMac 上(融合驱动器,没有 SSD)的测试运行中,在 30 秒内处理了 11MB。
$ TARGET=/var/log/install.log; du -h $TARGET | head -n 1; time smlr -lcb $TARGET > /tmp/output.txt
11M /var/log/install.log
Finished release [optimized] target(s) in 0.01s
Running `target/release/smlr -lcb /var/log/install.log`
real 0m19.603s
user 0m18.310s
sys 0m1.202s
示例 #1
假设我们想在以下数据中找到重复项
输入:samples/file03.txt | uniq-i-c file03.txt |
小布尔-cbf file03.txt |
---|---|---|
|
|
|
Table uniq vs smlr
让我惊讶的是,uniq
在查找一些不区分大小写的匹配项时似乎失败了。
uniq
的结果有点令人惊讶,因为我预计会找到 4 个披萨,而不是这里一个,那里一个。这个问题可以通过使用 sort
命令轻松解决。
在下面的示例中,我们使用 sort
对输入进行处理,以分组所有重复项。然后我们再次使用 sort
来首先显示最多的重复项。
$ cat file03.txt | sort | uniq -i -c | sort -r
3 pizza
3 PiZZa
2 Waffle
1 Popcorn
1 Peanuts
1 PIZZA
1 Ice Cream
1 Beef Jerky
尽管使用了 --i
,但 uniq
仍然在处理不同大小写的重复项时存在问题,但 sort
可以提供帮助。
$ cat file03.txt | sort -f | uniq -i -c | sort -r
7 PIZZA
2 Waffle
1 Popcorn
1 Peanuts
1 Ice Cream
1 Beef Jerky
示例 #2
如果我们对我们输入的一些字段进行一些修改,uniq
将在查找重复项时失败。
以下是我们的工作数据
2020-01-01 Pizza
2020-01-01 Ice Cream
2020-01-02 Waffle
2020-01-03 PiZZa
2020-03-05 Waffle
2020-03-05 pizza
2020-03-06 pizza
2020-03-06 Peanuts
2020-03-06 PIZZA
2020-03-06 Beef Jerky
2020-03-07 Popcorn
2020-03-07 pizza
2020-03-08 pizza
我们陷入了之前的 sort+uniq
方法。以下任何一种方法都无法按预期工作
cat file04.txt|sort-f|uniq-i-c-f1
cat file04.txt|sort-f|uniq-i-c-s10
失败的原因是我们的 sort
技巧不再有效。我们调用 awk
来救助
$ cat file04.txt | awk '{print $2}' | sort -f | uniq -c -i | sort -r
7 PIZZA
2 Waffle
1 Popcorn
1 Peanuts
1 Ice
1 Beef
示例 #3
这是一个棘手的例子,其中 uniq
即使在其他友好命令的帮助下也无法提供帮助
2020-01-01 Pizza
2020-01-01 Ice Cream
2020-01-01 Ice Cream
2020-01-02 Waffle
2020-01-03 PiZZa
2020-03-05 Waflle
2020-03-05 pizza
2020-03-06 piiza
2020-03-06 Peanuts
2020-03-06 PlZZA
2020-03-06 Beef Jerky
2020-03-07 POPCORN
2020-03-07 P0PCORN
2020-03-07 pizza
2020-03-08 pizza
这个例子中故意包含了一些错误。这些是通常很难发现的错误(取决于你的字体和专注程度)!
看看 smlr
如何处理这些。
$ time smlr -cbf file05.txt | sort -r
7 2020-01-01 Pizza
2 2020-03-07 POPCORN
2 2020-01-02 Waffle
2 2020-01-01 Ice Cream
1 2020-03-06 Peanuts
1 2020-03-06 Beef Jerky
real 0m0.005s
user 0m0.002s
sys 0m0.004s
虽然 smlr
可以做更多的事情,但它会在 CPU 和内存上有所消耗。在解析大文件时要小心!
从 Git 安装
cargo install --git https://gitlab.com/chevdor/smlr.git --tag v0.1.3
不建议在生产环境中安装 `master` 版本:在之前的命令中不要省略 `--tag v0.1.3`。
许可证
MIT License
Copyright (c) 2019-2020 Wilfried Kopp - Chevdor
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
依赖项
~1.7–2.7MB
~50K SLoC