用 cut、awk、paste 三命令按列切分文本文件,覆盖分隔符、字段范围与合并场景。
cut:按分隔符取列
cut 从每行输出选定的字节、字符或字段,默认分隔符为 TAB[1][2]。
cut -f 2 data.tsv
cut -d ',' -f 1,3 -s data.csv
cut --complement -f 2 data.tsv
-f LIST:选择字段,支持范围如1,3、2-4、3--d DELIM:指定分隔符(默认 TAB)-s:跳过不含分隔符的行--complement:取补集--output-delimiter=STR:指定输出分隔符
-s 很重要:不含分隔符的行默认原样输出,加上 -s 才会跳过[2]。
awk:更灵活的取列
awk 按空白分隔字段,$1、$2…取对应列,$0 是整行[3][4]。
awk '{print $2}' data.tsv
awk -F ',' 'BEGIN{OFS="|"} {print $1, $3}' data.csv
awk 'NR>1 && $3>100 {print $1, $2}' data.tsv
自定义分隔符用 -F,输出分隔符用 OFS。跳过首行表头、条件过滤也一行搞定。
awk 适合字段数不固定、需要计算或过滤的场景;cut 适合固定列、大文件快速切片[3]。
paste:合并多文件的列
paste 把多个文件的对应行合并为一行,用 TAB 分隔[5]。
paste a.txt b.txt
paste -d ',' -s a.txt
-d LIST:自定义分隔符-s:串行模式,把单文件多行合并为一行
选型建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 固定列、大文件 | cut | 启动快、内存低 |
| 需过滤/计算/条件 | awk | 表达能力强 |
| 合并多文件列 | paste | 一行命令完成 |
回滚
本操作只读取文件、不修改源文件;若输出写回原文件,先备份:
cp data.tsv data.tsv.bak
误操作后用备份恢复即可。
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
| cut 输出整行 | 未指定 -f 或分隔符不对 |
加 -f 并检查 -d |
| awk 字段为空 | 分隔符不是空白 | 用 -F 指定 |
| paste 行数不对齐 | 文件行数不同 | 先 wc -l 检查 |
| cut 跳过行不生效 | 忘加 -s |
加 -s 选项 |
实测与局限性
- 实测环境:WSL2 Ubuntu 24.04,coreutils 9.4,gawk 5.2.1。
- 已验证:cut 取字段/范围/补集/
-s、awk 取字段/自定义分隔符/OFS/条件过滤、paste 合并/自定义分隔符/串行模式。 - 局限性:未测多字节 UTF-8 字符按字符切分(
-c在多字节 locale 下行为依赖 locale);awk 的 CSV 引号字段未覆盖,复杂 CSV 建议用专用工具。
参考资料
- [1] cut(1) – Linux manual page (man7.org)(man7-cut)
- [2] cut(1) — coreutils — Debian trixie(debian-cut)
- [3] awk(1) — gawk — Debian trixie(debian-gawk)
- [4] gawk – Ubuntu manpages(ubuntu-gawk)
- [5] paste(1) – Linux manual page (man7.org)(man7-paste)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。