medialab/xan

GitHub: medialab/xan

一款基于 Rust 编写的高性能命令行 CSV 处理工具,专为在终端中快速操作、转换和可视化大型表格数据而设计。

Stars: 4318 | Forks: 85

[![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/097271ca091990be630ef6043309cc48240faa054413384202036fa2efedb2d2.svg)](https://github.com/medialab/xan/actions) [![DOI](https://zenodo.org/badge/140488417.svg)](https://doi.org/10.5281/zenodo.15310200) # `xan`,CSV 魔术师 `xan` 是一个命令行工具,可用于直接在 shell 中处理 CSV 文件。 它使用 Rust 编写,旨在实现最快的运行速度并尽可能降低内存消耗,能够非常轻松地处理大型 CSV 文件(GB 级别)。它采用了一种新颖的 [SIMD](https://en.wikipedia.org/wiki/Single_instruction,_multiple_data) CSV [解析器](https://docs.rs/simd-csv),并且能够(通过多线程)并行化某些计算,以使部分任务能以你计算机允许的最快速度完成。 它可以轻松地预览、过滤、切片、聚合、排序、关联 CSV 文件,并提供了大量可组合的命令,这些命令可以串联在一起以执行各种典型的任务。 `xan` 还提供了自己的表达式语言,因此你可以执行那些仅靠简单命令无法完成的复杂任务。这种极简的语言专为 CSV 数据量身定制,并且比执行 Python、Lua、JavaScript 等典型的动态类型语言要*快得多*。 请注意,该工具最初是 [BurntSushi](https://github.com/BurntSushi) 的 [`xsv`](https://github.com/BurntSushi/xsv) 的一个分支(fork),但目前几乎已被完全重写,以适应 [SciencesPo's médialab](https://github.com/medialab) 的使用场景,这些场景根植于面向社会科学的网络数据收集与分析(你可能认为 CSV 到现在早已过时,但在草率下结论之前,请先阅读我们写给该格式的[情书](./docs/LOVE_LETTER.md))。 因此,`xan` 超越了典型的数据操作范畴,并提供了与词汇计量学、图论甚至网页抓取相关的实用工具。 除了 CSV 数据之外,`xan` 还能够处理来自许多不同学科的各种类 CSV 数据格式,例如网络归档(`.cdx`)或生物信息学(`.vcf`、`.gtf`、`.sam`、`.bed` 等)。`xan` 还能够使用 [`xan to`](./docs/cmd/to.md) 和 [`xan from`](./docs/cmd/from.md) 在多种数据格式(如 json、excel 文件、numpy 数组等)之间进行相互转换。有关更多详细信息,请参阅[此](#supported-file-formats)章节。 最后,`xan` 可用于在终端中显示 CSV 文件以便于浏览,甚至可用于绘制基本的数据可视化图表: |*view 命令*|*flatten 命令*| |:---:|:---:| |![view](https://static.pigsec.cn/wp-content/uploads/repos/cas/e5/e54e4f9213526a95493753331c6bf5c999c3f2fd7b6b6f73ae81dc11e95de7f9.png)|![flatten](https://static.pigsec.cn/wp-content/uploads/repos/cas/81/81030b578f7875899c666db57c15ef62d8c683e03dc9840c830c41da2c7485c9.png)| |__*分类直方图*__|__*散点图*__| |![categ-hist](https://static.pigsec.cn/wp-content/uploads/repos/cas/1f/1fb9b7309513d7d21e34b446402bf03f24c77b1625af5c43a4078fddc412240d.png)|![correlation](https://static.pigsec.cn/wp-content/uploads/repos/cas/e2/e2476db3ee38cc6e142b46e9b886f444293cc934fc55b3be0b17fafb4cbefd5d.png)| |__*分类散点图*__|__*直方图*__| |![scatter](https://static.pigsec.cn/wp-content/uploads/repos/cas/6a/6a4e3c362104070bb011a4c471f6f4d572c7ce410785959799e5e4121419a36a.png)|![hist](https://static.pigsec.cn/wp-content/uploads/repos/cas/7c/7c739051ac132c63cdd1ff6b3bc4010f8cf5c32637e90a1ab72e066333d4f6e3.png)| |__*并行处理*__|__*时间序列*__| |![parallel](https://static.pigsec.cn/wp-content/uploads/repos/cas/7d/7d86e7a6786422fb5654c16e91504918ac9cbc9471ae2e006721ebce3aedb3c8.png)|![series](https://static.pigsec.cn/wp-content/uploads/repos/cas/04/042816b44f1b95659d06d75e1b8478421a5cee9b77ef09a7fae5907eab644b5b.png)| |__*小倍数(网格分面)*__|__*分组视图*__| |![small-multiples](https://static.pigsec.cn/wp-content/uploads/repos/cas/2d/2dd22ef1b2e12bfc4112ae12d56cb9ca6aa9e8e7c654c985c2a9883ddc1c1c70.png)|![view-grid](https://static.pigsec.cn/wp-content/uploads/repos/cas/3a/3a0ea0d5efba261f939f99d9ad648f28566c1500593f8d766d77eece3cfbb157.png)| |__*相关矩阵热力图*__|__*热力图*__| |![small-multiples](https://static.pigsec.cn/wp-content/uploads/repos/cas/5e/5e843b4079109415323b1259669ded6928fa062a5be96a9f71e852218e74b1cc.png)|![view-grid](https://static.pigsec.cn/wp-content/uploads/repos/cas/f9/f9e20d1bee4b0c6408058d4e542bb8492faf76cd84b84ea1829f7c131a210097.png)| ## 概要 * [如何安装](#how-to-install) * [Cargo](#cargo) * [Scoop (Windows)](#scoop-windows) * [Homebrew (macOS)](#homebrew-macos) * [Arch Linux](#arch-linux) * [NetBSD](#netbsd) * [Nix](#nix) * [Pixi](#pixi-linux-macos-windows) * [Conda Forge](#conda-forge) * [预编译二进制文件](#pre-built-binaries) * [安装补全](#installing-completions) * [快速浏览](#quick-tour) * [学习](#learning) * [可用命令](#available-commands) * [通用标志与 IO 模型](#general-flags-and-io-model) * [获取帮助](#getting-help) * [关于输入与输出格式](#regarding-input--output-formats) * [处理无表头的 CSV 文件](#working-with-headless-csv-file) * [关于 stdin](#regarding-stdin) * [关于 stdout](#regarding-stdout) * [支持的文件格式](#supported-file-formats) * [压缩文件](#compressed-files) * [关于颜色](#regarding-color) * [表达式语言参考](#expression-language-reference) * [新闻](#news) * [如何引用?](#how-to-cite) * [常见问题](#frequently-asked-questions) ## 如何安装 ### Cargo `xan` 可以使用 cargo 安装(它通常随 [Rust](https://www.rust-lang.org/tools/install) 一起提供): ``` cargo install xan --locked ``` *可选特性* 某些特性默认不会被构建,因为它们在编译时间或可执行文件大小方面代价过高。以下是这些可选特性的列表: * `parquet`:启用 `xan from -f parquet` 你可以像这样指定你想要的可选特性: ``` # 启用所有可选特性 cargo install xan --locked --all-features # 仅启用特定特性 cargo install xan --locked --features parquet ``` 你还可以调整构建标志,以确保 Rust 编译器能够利用你 CPU 的所有特性: ``` CARGO_BUILD_RUSTFLAGS='-C target-cpu=native' cargo install xan --locked ``` 你也可以像这样安装最新的开发版本: ``` cargo install --git https://github.com/medialab/xan --locked ``` ### Scoop (Windows) 在 Windows 上,可以使用 [Scoop](https://scoop.sh/) 安装 `xan`: ``` scoop bucket add extras scoop install xan ``` ### Homebrew (macOS) 在 macOS 上,可以通过 [Homebrew](https://brew.sh/) 像这样安装 `xan`: ``` brew install xan ``` ### Arch Linux 你可以使用 `pacman` 从 [extra 仓库](https://archlinux.org/packages/extra/x86_64/xan/)安装 `xan`: ``` sudo pacman -S xan ``` ### NetBSD 官方仓库中提供了该软件包。要安装 `xan`,只需运行: ``` pkgin install xan ``` ### Nix `xan` 已打包适用于 Nix,并从 25.05 版本起在 Nixpkgs 中可用。要安装它,你可以将其作为 `pkgs.xan` 添加到你的 `environment.systemPackages` 中,或者使用 `nix-shell` 进入一个临时 shell。 ``` nix-shell -p xan ``` ### Pixi (Linux, macOS, Windows) 可以使用 [Pixi](https://pixi.sh/latest/) 包管理器在 Linux、macOS 和 Windows 上安装 `xan`: ``` pixi global install xan ``` ### Conda Forge 可以通过 [conda-forge](https://conda-forge.org/) 像这样安装 `xan`: ``` conda install conda-forge::xan ``` ### 预编译二进制文件 每个 GitHub [发布](https://github.com/medialab/xan/releases/latest)页面都附带了预编译的二进制文件。 目前支持的目标包括: - `x86_64-apple-darwin` - `x86_64-unknown-linux-gnu` - `x86_64-unknown-linux-musl` - `x86_64-pc-windows-msvc` - `aarch64-apple-darwin` - `aarch64-unknown-linux-gnu` `ppc64le` 目标尚未由 CI 构建,但如果你需要,仍然可以在 `conda-forge` 软件包的[文件](https://anaconda.org/conda-forge/xan/files)中找到预编译的二进制文件。 欢迎提交 PR,通过添加相关目标来改进 CI。 ### 安装补全 请注意,`xan` 还为命令和表头/列名提供了便捷的自动补全功能,你可以通过 `xan completions` 命令进行安装。 运行以下命令以了解如何安装这些补全: ``` xan completions -h ``` 对于 `zsh`,你可以将补全文件添加到 `~/.zfunc`: ``` mkdir -p ~/.zfunc xan completions zsh > ~/.zfunc/_xan ``` 然后在你的 `~/.zshrc` 中的 `compinit` 之前添加以下内容: ``` fpath=(~/.zfunc $fpath) autoload -Uz compinit compinit ``` ## 快速浏览 让我们通过探索一个法国媒体语料库来了解最常用的 `xan` 命令: ### 下载语料库 ``` curl -LO https://github.com/medialab/corpora/raw/master/polarisation/medias.csv ``` ### 显示文件表头 ``` xan headers medias.csv ``` ``` 0 webentity_id 1 name 2 prefixes 3 home_page 4 start_pages 5 indegree 6 hyphe_creation_timestamp 7 hyphe_last_modification_timestamp 8 outreach 9 foundation_year 10 batch 11 edito 12 parody 13 origin 14 digital_native 15 mediacloud_ids 16 wheel_category 17 wheel_subcategory 18 has_paywall 19 inactive ``` ### 统计行数 ``` xan count medias.csv ``` ``` 478 ``` ### 在终端预览文件 ``` xan view medias.csv ``` ``` Displaying 5/20 cols from 10 first rows of medias.csv ┌───┬───────────────┬───────────────┬────────────┬───┬─────────────┬──────────┐ │ - │ name │ prefixes │ home_page │ … │ has_paywall │ inactive │ ├───┼───────────────┼───────────────┼────────────┼───┼─────────────┼──────────┤ │ 0 │ Acrimed.org │ http://acrim… │ http://ww… │ … │ false │ │ │ 1 │ 24matins.fr │ http://24mat… │ https://w… │ … │ false │ │ │ 2 │ Actumag.info │ http://actum… │ https://a… │ … │ false │ │ │ 3 │ 2012un-Nouve… │ http://2012u… │ http://ww… │ … │ false │ │ │ 4 │ 24heuresactu… │ http://24heu… │ http://24… │ … │ false │ │ │ 5 │ AgoraVox │ http://agora… │ http://ww… │ … │ false │ │ │ 6 │ Al-Kanz.org │ http://al-ka… │ https://w… │ … │ false │ │ │ 7 │ Alalumieredu… │ http://alalu… │ http://al… │ … │ false │ │ │ 8 │ Allodocteurs… │ http://allod… │ https://w… │ … │ false │ │ │ 9 │ Alterinfo.net │ http://alter… │ http://ww… │ … │ │ true │ │ … │ … │ … │ … │ … │ … │ … │ └───┴───────────────┴───────────────┴────────────┴───┴─────────────┴──────────┘ ``` 在 unix 系统上,请毫不犹豫地使用 `-p` 标志,它会自动将全部输出转发给合适的分页器(pager),方便你浏览所有列。 ### 读取第一行的扁平化表示 ``` # 注意:去掉 -c 以避免截断值 xan flatten -c medias.csv ``` ``` Row n°0 ─────────────────────────────────────────────────────────────────────────────── webentity_id 1 name Acrimed.org prefixes http://acrimed.org|http://acrimed69.blogspot… home_page http://www.acrimed.org start_pages http://acrimed.org|http://acrimed69.blogspot… indegree 61 hyphe_creation_timestamp 1560347020330 hyphe_last_modification_timestamp 1560526005389 outreach nationale foundation_year 2002 batch 1 edito media parody false origin france digital_native true mediacloud_ids 258269 wheel_category Opinion Journalism wheel_subcategory Left Wing has_paywall false inactive Row n°1 ─────────────────────────────────────────────────────────────────────────────── webentity_id 2 ... ``` ### 搜索行 ``` xan search -s outreach internationale medias.csv | xan view ``` ``` Displaying 4/20 cols from 10 first rows of ┌───┬──────────────┬────────────────────┬───┬─────────────┬──────────┐ │ - │ webentity_id │ name │ … │ has_paywall │ inactive │ ├───┼──────────────┼────────────────────┼───┼─────────────┼──────────┤ │ 0 │ 25 │ Businessinsider.fr │ … │ false │ │ │ 1 │ 59 │ Europe-Israel.org │ … │ false │ │ │ 2 │ 66 │ France 24 │ … │ false │ │ │ 3 │ 220 │ RFI │ … │ false │ │ │ 4 │ 231 │ fr.Sott.net │ … │ false │ │ │ 5 │ 246 │ Voltairenet.org │ … │ true │ │ │ 6 │ 254 │ Afp.com /fr │ … │ false │ │ │ 7 │ 265 │ Euronews FR │ … │ false │ │ │ 8 │ 333 │ Arte.tv │ … │ false │ │ │ 9 │ 341 │ I24News.tv │ … │ false │ │ │ … │ … │ … │ … │ … │ … │ └───┴──────────────┴────────────────────┴───┴─────────────┴──────────┘ ``` ### 选择某些列 ``` xan select foundation_year,name medias.csv | xan view ``` ``` Displaying 2 cols from 10 first rows of ┌───┬─────────────────┬───────────────────────────────────────┐ │ - │ foundation_year │ name │ ├───┼─────────────────┼───────────────────────────────────────┤ │ 0 │ 2002 │ Acrimed.org │ │ 1 │ 2006 │ 24matins.fr │ │ 2 │ 2013 │ Actumag.info │ │ 3 │ 2012 │ 2012un-Nouveau-Paradigme.com │ │ 4 │ 2010 │ 24heuresactu.com │ │ 5 │ 2005 │ AgoraVox │ │ 6 │ 2008 │ Al-Kanz.org │ │ 7 │ 2012 │ Alalumieredunouveaumonde.blogspot.com │ │ 8 │ 2005 │ Allodocteurs.fr │ │ 9 │ 2005 │ Alterinfo.net │ │ … │ … │ … │ └───┴─────────────────┴───────────────────────────────────────┘ ``` ### 文件排序 ``` xan sort -s foundation_year medias.csv | xan view -s name,foundation_year ``` ``` Displaying 2 cols from 10 first rows of ┌───┬────────────────────────────────────┬─────────────────┐ │ - │ name │ foundation_year │ ├───┼────────────────────────────────────┼─────────────────┤ │ 0 │ Le Monde Numérique (Ouest France) │ │ │ 1 │ Le Figaro │ 1826 │ │ 2 │ Le journal de Saône-et-Loire │ 1826 │ │ 3 │ L'Indépendant │ 1846 │ │ 4 │ Le Progrès │ 1859 │ │ 5 │ La Dépêche du Midi │ 1870 │ │ 6 │ Le Pélerin │ 1873 │ │ 7 │ Dernières Nouvelles d'Alsace (DNA) │ 1877 │ │ 8 │ La Croix │ 1883 │ │ 9 │ Le Chasseur Francais │ 1885 │ │ … │ … │ … │ └───┴────────────────────────────────────┴─────────────────┘ ``` ### 基于某列对文件去重 ``` # 我们语料库中的某些媒体在 mediacloud.org 上具有相同的 id xan dedup -s mediacloud_ids medias.csv | xan count && xan count medias.csv ``` ``` 457 478 ``` 也可以在排序的同时进行去重: ``` xan sort -s mediacloud_ids -u medias.csv ``` ### 计算频率表 ``` xan frequency -s edito medias.csv | xan view ``` ``` Displaying 3 cols from 5 rows of ┌───┬───────┬────────────┬───────┐ │ - │ field │ value │ count │ ├───┼───────┼────────────┼───────┤ │ 0 │ edito │ media │ 423 │ │ 1 │ edito │ individu │ 30 │ │ 2 │ edito │ plateforme │ 14 │ │ 3 │ edito │ agrégateur │ 10 │ │ 4 │ edito │ agence │ 1 │ └───┴───────┴────────────┴───────┘ ``` ### 打印直方图 ``` xan frequency -s edito medias.csv | xan hist ``` ``` Histogram for edito (bars: 5, sum: 478, max: 423): media |423 88.49%|━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━| individu | 30 6.28%|━━━╸ | plateforme | 14 2.93%|━╸ | agrégateur | 10 2.09%|━╸ | agence | 1 0.21%|╸ | ``` ### 计算描述性统计 ``` xan stats -s indegree,edito medias.csv | xan transpose | xan view -I ``` ``` Displaying 2 cols from 14 rows of ┌─────────────┬───────────────────┬────────────┐ │ field │ indegree │ edito │ ├─────────────┼───────────────────┼────────────┤ │ count │ 463 │ 478 │ │ count_empty │ 15 │ 0 │ │ type │ int │ string │ │ types │ int|empty │ string │ │ sum │ 25987 │ │ │ mean │ 56.12742980561554 │ │ │ variance │ 4234.530197929737 │ │ │ stddev │ 65.07326792108829 │ │ │ min │ 0 │ │ │ max │ 424 │ │ │ lex_first │ 0 │ agence │ │ lex_last │ 99 │ plateforme │ │ min_length │ 0 │ 5 │ │ max_length │ 3 │ 11 │ └─────────────┴───────────────────┴────────────┘ ``` ### 通过评估表达式来过滤文件 ``` xan filter 'batch > 1' medias.csv | xan count ``` ``` 130 ``` 要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。 ### 通过评估表达式基于其他列创建新列 ``` xan map 'fmt("{} ({})", name, foundation_year) as key' medias.csv | xan select key | xan slice -l 10 ``` ``` key Acrimed.org (2002) 24matins.fr (2006) Actumag.info (2013) 2012un-Nouveau-Paradigme.com (2012) 24heuresactu.com (2010) AgoraVox (2005) Al-Kanz.org (2008) Alalumieredunouveaumonde.blogspot.com (2012) Allodocteurs.fr (2005) Alterinfo.net (2005) ``` 要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。 ### 通过评估表达式转换列 ``` xan transform name 'split(name, ".") | first | upper' medias.csv | xan select name | xan slice -l 10 ``` ``` name ACRIMED 24MATINS ACTUMAG 2012UN-NOUVEAU-PARADIGME 24HEURESACTU AGORAVOX AL-KANZ ALALUMIEREDUNOUVEAUMONDE ALLODOCTEURS ALTERINFO ``` 要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。 ### 执行自定义聚合 ``` xan agg 'sum(indegree) as total_indegree, mean(indegree) as mean_indegree' medias.csv | xan view -I ``` ``` Displaying 1 col from 1 rows of ┌────────────────┬───────────────────┐ │ total_indegree │ mean_indegree │ ├────────────────┼───────────────────┤ │ 25987 │ 56.12742980561554 │ └────────────────┴───────────────────┘ ``` 要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。最后,要显示可用的[聚合函数](./docs/moonblade/aggs.md)列表,请运行 `xan help aggs`。 ### 对行进行分组并执行分组聚合 ``` xan groupby edito 'sum(indegree) as indegree' medias.csv | xan view -I ``` ``` Displaying 1 col from 5 rows of ┌────────────┬──────────┐ │ edito │ indegree │ ├────────────┼──────────┤ │ agence │ 50 │ │ agrégateur │ 459 │ │ plateforme │ 658 │ │ media │ 24161 │ │ individu │ 659 │ └────────────┴──────────┘ ``` 要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。最后,要显示可用的[聚合函数](./docs/moonblade/aggs.md)列表,请运行 `xan help aggs`。 ## 学习 如果你懂法语,[这里](https://ceres.sorbonne-universite.fr/test_outil_xan/)是我们来自 [CERES](https://ceres.sorbonne-universite.fr/) 的朋友对该工具的快速介绍。 *已记录的使用场景* * [在终端舒适地进行数据可视化](./docs/cookbook/dataviz.md) * [合并频率表的三种方法](./docs/cookbook/frequency_tables.md) * [使用 xan 解析和可视化日期](./docs/cookbook/dates.md) * [通过 URL 前缀关联文件](./docs/cookbook/urls.md) 要了解 `xan` 能实现哪些功能,请参阅此页面。该页面总结了各种复杂但详细的管道(pipeline),这些管道已由真实用户在现实生活中使用该工具解决了他们的问题:[PIPELINES](./docs/PIPELINES.md)。 ## 可用命令 - [**help**](./docs/cmd/help.md):获取有关表达式语言的帮助 *探索与可视化* - [**count (c)**](./docs/cmd/count.md):统计文件中的行数 - [**headers (h)**](./docs/cmd/headers.md):显示表头名称 - [**view (v)**](./docs/cmd/view.md):以人性化的方式预览 CSV 文件 - [**flatten**](./docs/cmd/flatten.md):显示文件每一行的扁平化版本 - [**hist**](./docs/cmd/hist.md):打印直方图,将 CSV 文件的行作为条形显示 - [**plot**](./docs/cmd/plot.md):绘制散点图或折线图 - [**heatmap**](./docs/cmd/heatmap.md):绘制 CSV 矩阵的热力图 - [**spark**](`(通常在某些 Windows shell 中),这会非常有用。在这种情况下,使用 `-` 作为输出路径也意味着转发到 stdout。这在编写脚本时有时很有用。 ### 支持的文件格式 `xan` 能够开箱即用地处理各种类 CSV 数据格式: - `.csv` 文件将被视为逗号分隔 - `.tsv` 和 `.tab` 文件将被视为制表符分隔 - `.scsv` 和 `.ssv` 文件将被视为分号分隔 - `.psv` 文件将被视为竖线(pipe)分隔 - `.cdx` 文件(一种与网络归档相关的索引文件[格式](https://iipc.github.io/warc-specifications/specifications/cdx-format/cdx-2015/))将被视为空格分隔,并且会丢弃其魔数(magic bytes) - `.ndjson` 和 `.jsonl` 文件将被视为制表符分隔、无表头、并以空字节(null-byte)引用,因此你可以轻松地将它们与 `xan` 命令结合使用(例如,使用表达式语言来解析或处理 JSON 数据以进行聚合,甚至是并行聚合)。如果你需要对换行符分隔的 JSON 数据进行更彻底的转换,请查看 `xan from -f ndjson` 命令。 - 生物信息学中的 `.vcf` 文件([Variant Call Format](https://en.wikipedia.org/wiki/Variant_Call_Format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为制表符分隔。 - 生物信息学中的 `.gtf` 和 `.gff2` 文件([Gene Transfert Format](https://en.wikipedia.org/wiki/Gene_transfer_format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为无表头和制表符分隔。 - 生物信息学中的 `.sam` 文件([Sequence Alignment Map](https://en.wikipedia.org/wiki/SAM_(file_format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为无表头和制表符分隔。 - 生物信息学中的 `.bed` 文件([Browser Extensible Data](https://en.wikipedia.org/wiki/BED_(file_format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为无表头和制表符分隔。 请注意,使用无处不在的 `-d, --delimiter` 标志始终可以处理更加奇特的分隔符。 一些附加格式(例如 `.gff`、`.gff3`)也受支持,但必须首先使用 `xan input` 命令进行规范化,因为它们的单元格必须进行修剪,或者包含需要跳过的注释行。 还需注意,处理时总是会从数据中剥离 UTF-8 BOM。 ### 压缩文件 `xan` 能够读取 gzip 压缩的文件(具有 `.gz` 扩展名)。在需要进行查找(常数时间反转、并行化等)时,它还能够利用 `.gzi` 索引(通常通过 [`bgzip`](https://www.htslib.org/doc/bgzip.html) 创建)。 `xan` 还能够读取使用 [`Zstdandard`](https://github.com/facebook/zstd) 压缩的文件(具有 `.zst` 扩展名)。 ### 关于颜色 某些 `xan` 命令默认会在终端打印 ANSI 颜色,典型的有 `view`、`flatten` 等。 所有这些命令都有一个标准的 `--color=(auto|always|never)` 标志,以便在需要时调整着色行为(请注意,默认情况下,当命令通过管道传递时不会打印颜色)。 它们还遵循与 ANSI 着色相关的典型环境变量,例如 `NO_COLOR`、`CLICOLOR` 和 `CLICOLOR_FORCE`,详见[此处](https://bixense.com/clicolors/)的文档。 另外,请注意,某些 `xan` 命令(尤其是 `xan heatmap` 和 `xan spark`)需要一个能够显示 `truecolor`(24位)ANSI 颜色的终端(至少如果你希望它们能够打印连续的颜色渐变)。 有时你可能需要显式地将 `COLORTERM` 环境变量设置为 `truecolor`,如果你知道你的终端支持它们,但你的 shell 却不知道(例如,有时在使用 `screen`、`tmux` 或 `ssh` 时)。 ## 表达式语言参考 - [速查表](./docs/moonblade/cheatsheet.md) - [函数与操作符的综合列表](./docs/moonblade/functions.md) - [聚合函数的综合列表](./docs/moonblade/aggs.md) - [窗口聚合函数的综合列表](./docs/moonblade/window.md) - [抓取 DSL](./docs/moonblade/scraping.md) ## 新闻 有关该工具演进的信息,欢迎阅读: 1. [更新日志](CHANGELOG.md) 2. [xan 杂志](./docs/XANZINE.md) 3. [路线图](https://github.com/medialab/xan/discussions/910) 另请参阅与该工具相关的博客文章: * [邪恶工程:在 CSV 文件中随机跳转而不会伤到自己](./docs/blog/csv_base_jumping.md) ## 如何引用? `xan` 已在 [Zen](https://zenodo.org/) 上发布,编号为 [10.5281/zenodo.15310200](https://doi.org/10.5281/zenodo.15310200)。 你可以像这样引用它: ## 常见问题 ### 如何显示垂直条形图? 旋转你的屏幕 ;\)
标签:CSV, Rust, 代码示例, 可视化界面, 数据分析, 文本分析, 网络流量审计, 通知系统