如何调整awk命令实现拆分tsv文件并输出为CSV格式
解决方案
你只需要修改原有awk命令的4处位置,即可直接输出符合要求的CSV格式文件,修改后的完整命令如下:
awk -v lines="30000" -v pre="awk_part_" ' BEGIN { FS="\t"; OFS="," } NR==1 { header=$0; gsub(/\t/, ",", header); next} (NR-1) % lines ==1 { fname=pre c++ ".csv"; print header > fname} { $1=$1; print > fname}' patient.tsv
关键修改说明
- 新增
BEGIN { FS="\t"; OFS="," }块:指定输入的TSV文件分隔符为制表符,输出的CSV文件分隔符为逗号 - 表头处理逻辑增加制表符替换:
gsub(/\t/, ",", header),确保表头也符合CSV的逗号分隔规则 - 生成文件名时拼接
.csv后缀:将原有fname=pre c++修改为fname=pre c++ ".csv",直接生成后缀正确的CSV文件 - 打印行前添加
$1=$1:触发awk使用输出分隔符重组整行,将每行的制表符自动替换为逗号
如果你的原始TSV文件中存在包含逗号、双引号、换行的字段,可使用以下符合CSV标准规范的进阶版本,会自动对特殊字段做转义处理:
awk -v lines="30000" -v pre="awk_part_" ' BEGIN { FS="\t"; OFS="," } function escape_csv(field) { if (index(field, ",") || index(field, "\"") || index(field, "\n")) { gsub(/"/, "\"\"", field) return "\"" field "\"" } return field } NR==1 { for (i=1; i<=NF; i++) header = header (i>1 ? OFS : "") escape_csv($i) next } (NR-1) % lines ==1 { close(fname) fname=pre c++ ".csv" print header > fname } { line = "" for (i=1; i<=NF; i++) line = line (i>1 ? OFS : "") escape_csv($i) print line > fname }' patient.tsv
进阶版本补充说明
- 新增
escape_csv自定义函数:对包含特殊字符的字段自动添加双引号包裹,同时将字段内的双引号转义为两个连续双引号,符合RFC 4180 CSV标准 - 添加
close(fname)逻辑:避免拆分文件过多时awk触发打开文件数超过系统限制的报错
内容的提问来源于stack exchange,提问作者user3776623
相关产品推荐
相关产品推荐

