Linux如何使用Shell处理CSV文件_Linux Shell处理CSV文件攻略

夜萱大大_9429

夜萱大大_9429

2026-04-04

711人浏览

原创

直接用awk、cut、sed处理csv仅在无引号、无嵌套逗号、无空字段时安全;遇"new york, ny"等场景会错位,属工具能力边界问题,应改用csvtool或python csv模块。

linux如何使用shell处理csv文件_linux shell处理csv文件攻略

直接用 awk、cut、sed 处理 CSV 文件,只在字段简单、无引号、无嵌套逗号时才安全;一旦出现 "New York, NY" 或空字段,cut -d',' -f3 就会错位——这不是你脚本写错了,是工具能力边界问题。

用 cut 提取列:快但脆弱

适合纯 ASCII、无引号、无空字段的 CSV(比如日志导出或内部脚本生成的数据)。

  • cut -d',' -f2,4 data.csv 提取第 2 和第 4 列,分隔符必须严格是逗号;若某行含 "a,b",c,d,cut 会切出 5 段,-f2,4 拿到的是 b 和 c,而非预期的 a,b 和 d
  • 字段含前后空格时,cut 不清洗,输出如 "Alice" ,后续 grep 或数值比较易失败
  • 不支持跳过表头,得靠 tail -n +2 data.csv | cut ... 手动绕过

用 awk 做基础清洗和筛选

比 cut 强,能跳过空行、做简单条件判断、格式化输出,但仍无法正确解析带引号的嵌套逗号。

  • awk -F',' 'NF && $3 > 25 {print $1, $3}' data.csv:跳过空行(NF)、过滤第三列大于 25 的行,并打印第一、三列
  • 字段含空格?加 gsub(/^[[:space:]]+|[[:space:]]+$/, "", $1) 清洗首尾空白
  • 想把 age 列转成“28岁”?用 printf "%s %d岁\n", $1, $3,别用 print,否则可能多空行
  • 若某行只有两列而你读 $3,awk 不报错,而是返回空字符串——容易静默出错,建议先检查 NF >= 3

用 while read 处理带逻辑的逐行操作

适合需要 shell 变量参与判断、调用外部命令(如 date -d 解析时间)、或组合多个条件的场景。

  • 必须设 IFS=',',否则默认按空白分割;加 -r 防止反斜杠被吃掉:while IFS=',' read -r id name age city; do ...
  • 表头跳过写成 if [ "$id" = "id" ]; then continue; fi,别依赖行号,因为可能有空行干扰
  • 字段本身含逗号?read 会直接劈开,无法恢复——这时已超出 shell 内建能力,该换工具
  • 性能差:每行启动一次子 shell,处理百万行 CSV 明显慢于 awk

什么时候必须放弃 shell,改用专业工具

当 CSV 出现以下任一情况,硬撑只会让脚本越来越难维护:

  • 字段含引号包裹的逗号,例如 "John, Doe",32,"San Francisco"
  • 字段含换行符(合法 CSV 允许引号内换行)
  • 需处理 UTF-8 中文、BOM 头、或混合编码
  • 要验证字段类型(如强制 $3 是整数)、做跨行聚合(如按城市统计平均年龄)

此时应切换到 csvtool(Debian/Ubuntu 自带)或 Python 的 csv 模块——不是“更高级”,而是它们专为 CSV RFC 4180 设计,shell 工具根本没打算解决这个问题。

热门游戏推荐
热门游戏推荐

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2740

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.25

354

5

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

748

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1009

10

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.24

747

6

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1678

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2564

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

5984

49

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习