方法1:使用 cut
命令(简单分隔符场景)
适用场景:列由固定分隔符(如逗号、制表符)分隔,且列位置连续。
命令格式:
cut -d '分隔符' -f 列序号列表 文件名
示例:
# 提取第1到第3列(分隔符为制表符,默认) cut -f 1-3 data.txt
注意:
-d
指定分隔符(默认制表符),-f
指定列号(支持1,3,5
或2-5
格式)。- 缺点:无法处理空格等不固定分隔符。
方法2:使用 awk
命令(灵活处理复杂格式)
适用场景:分隔符不固定、需条件过滤或非连续列。
命令格式:
awk -F '分隔符' '{print $列1 $列2 ...}' 文件名
示例:
# 提取第1列和第3列(分隔符为空格或制表符) awk '{print $1, $3}' data.txt # 提取第2列和第4列(分隔符为冒号) awk -F ':' '{print $2, $4}' /etc/passwd # 结合条件:仅当第3列大于10时输出第1列和第2列 awk '$3 > 10 {print $1, $2}' data.csv
优势:
-F
支持正则表达式(如-F "[,:]"
表示逗号或冒号)。- 列号用加数字表示(
$1
为第一列),OFS
变量可自定义输出分隔符(如awk 'BEGIN{OFS=";"} {...}'
)。
方法3:使用 paste
+ 循环(合并多个命令的输出)
适用场景:需从不同命令或非连续列组合数据。
示例:
# 合并ls命令的第1列(文件名)和第5列(大小) ls -l | awk '{print $1}' > col1.txt ls -l | awk '{print $5}' > col5.txt paste col1.txt col5.txt
简化写法:
paste <(ls -l | awk '{print $1}') <(ls -l | awk '{print $5}')
方法4:使用 datamash
工具(结构化数据处理)
适用场景:需高级表格操作(需安装:sudo apt install datamash
)。
示例:
# 提取第1列和第3列(分隔符为空格) datamash -t ' ' cut 1,3 data.txt
总结与建议
方法 | 最佳场景 | 优势 |
---|---|---|
cut |
简单分隔符、连续列 | 语法简洁,执行速度快 |
awk |
复杂分隔符、条件过滤、非连续列 | 功能强大,灵活度高 |
paste |
合并多命令输出 | 适合管道操作 |
datamash |
结构化数据的高级操作 | 支持统计、排序等扩展功能 |
安全提示:
- 处理用户输入文件时,避免使用
-i
原地修改参数,建议先备份。- 对未知文件先用
head
预览结构(如head -n 5 file
)。
引用说明:
本文方法参考GNU Coreutils官方文档(cut、awk)及Linux man手册,实践前建议通过man cut
或man awk
查看系统帮助。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8954.html