#delimiter #csv #cut #field #version #respects #file

app cutr

Rust 编写的尊重分隔符的 cut 版本

1 个不稳定版本

0.1.0 2024年3月4日

命令行工具 中排名第 1893

自定义许可协议

24KB
356 代码行

cutr

Rust 版本的 cut,它尊重分隔符

概述

Usage: cutr [OPTIONS] 
       <--fields <FIELDS>|--bytes <BYTES>|--chars <CHARS>> [FILES]...

Arguments:
  [FILES]...  Input file(s) [default: -]

Options:
  -d, --delimiter <DELIMITER>                Field delimiter [default: "\t"]
  -o, --output-delimiter <OUTPUT_DELIMITER>  Field delimiter
  -f, --fields <FIELDS>                      Selected fields
  -b, --bytes <BYTES>                        Selected bytes
  -c, --chars <CHARS>                        Selected chars
  -h, --help                                 Print help
  -V, --version                              Print version

原理

标准的 BSD/GNU 版本的 cut 不尊重转义的字段分隔符。例如,给定一个逗号分隔值 (CSV) 文件如下

$ cat tests/inputs/books.csv
Author,Year,Title
Émile Zola,1865,La Confession de Claude
Samuel Beckett,1952,Waiting for Godot
Jules Verne,1870,"20,000 Leagues Under the Sea"

20,000 Leagues Under the Sea 中的逗号被视为字段分隔符,因此该列被截断

$ cut -d , -f 3 tests/inputs/books.csv
Title
La Confession de Claude
Waiting for Godot
"20

这个 Rust 版本尊重转义的分隔符

$ cutr -d , -f 3 tests/inputs/books.csv
Title
La Confession de Claude
Waiting for Godot
"20,000 Leagues Under the Sea"

此外,cut 允许随机选择字段,但不尊重用户指定的顺序。例如,在下面的命令中,我期望 cut 返回按 Year 和然后 Author 排序的列,但该工具按文件顺序返回它们

$ cut -d , -f 2,1 tests/inputs/books.csv
Author,Year
Émile Zola,1865
Samuel Beckett,1952
Jules Verne,1870

这个 Rust 版本将按请求的顺序返回选择

$ cutr -d , -f 2,1 tests/inputs/books.csv
Year,Author
1865,Émile Zola
1952,Samuel Beckett
1870,Jules Verne

在解析分隔符文件时,输出字段分隔符默认为输入分隔符,但您可以指定一个不同的值。例如,输入文件可能是 CSV,但我想以制表符字符作为输出分隔符

$cutr -d , -o $'\t' -f 2,1 tests/inputs/books.csv
Year	Author
1865	Émile Zola
1952	Samuel Beckett
1870	Jules Verne

待办事项

  • 原始的 cut 工具允许进行开放式选择,例如 -3 表示第一个到第三个字段或 5- 表示第五个字段到记录的末尾。这个版本只允许封闭范围,所以我希望添加这个功能。

作者

Ken Youens-Clark [email protected]

依赖项

~26–43MB
~783K SLoC