首页 > Sysadmin > 正文

Linux 读取文件某一列:cut 与 awk

huyuanwen 2026-11-03 Sysadmin

用 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 建议用专用工具。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。