如何使用awk修改CSV文件中的日期格式(MM/DD/YYYY转YYYY/MM/DD)
没问题,我来给你几个实用的方案,不管是用awk还是其他工具都能搞定这个日期格式转换的需求~
用awk实现日期格式转换
awk是处理这类文本转换的利器,根据你的CSV结构不同,有几种针对性的写法:
情况1:所有字段都是MM/DD/YYYY格式
如果你的CSV里每一列都是日期,直接遍历所有字段处理即可:
awk -F',' -v OFS=',' '{for(i=1; i<=NF; i++) {split($i, d, "/"); $i = d[3]"/"d[1]"/"d[2]}}1' input.csv > output.csv
-F','和-v OFS=','分别指定输入和输出的字段分隔符为逗号,保证CSV格式不变split($i, d, "/")把每个日期字段拆分成月(d[1])、日(d[2])、年(d[3])- 最后用
1触发awk默认的打印行为,输出所有处理后的行
情况2:只有特定列是日期(比如第2列)
如果只有某一列是日期(比如业务数据里只有交易日期列需要转换),只需要单独处理该列:
awk -F',' -v OFS=',' '{split($2, d, "/"); $2 = d[3]"/"d[1]"/"d[2]}1' input.csv > output.csv
把$2换成你实际需要处理的列号即可(比如第3列就是$3)。
情况3:日期字段带双引号
很多CSV会给字段加双引号(比如"03/15/2024"),这种情况可以先去掉引号处理,再重新加上:
awk -F',' -v OFS=',' '{gsub(/"/, "", $2); split($2, d, "/"); $2 = "\""d[3]"/"d[1]"/"d[2]"\""}1' input.csv > output.csv
gsub(/"/, "", $2)移除第2列的所有双引号- 处理完日期后用
"\""把新日期包起来,保持CSV的引号格式
其他工具方案
用sed快速替换(适合简单场景)
如果你的CSV里只有日期字段带斜杠,没有其他干扰字符,可以用sed的正则替换快速搞定:
sed -E 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/\3\/\1\/\2/g' input.csv > output.csv
-E启用扩展正则表达式,让匹配更简洁- 正则
([0-9]{2})\/([0-9]{2})\/([0-9]{4})精准匹配MM/DD/YYYY格式 - 替换为
\3\/\1\/\2,也就是把年移到最前面,月和日保持顺序
用Python处理复杂CSV(推荐用于边缘场景)
如果你的CSV结构复杂(比如字段里有换行、嵌套引号),用Python的csv模块会更稳妥,它能自动处理CSV的各种规范:
import csv # 替换成你的输入输出文件路径 input_file = 'input.csv' output_file = 'output.csv' with open(input_file, 'r') as infile, open(output_file, 'w', newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) for row in reader: # 假设第2列是日期(索引从0开始,所以是row[1]) date_str = row[1].strip('"') # 移除可能的双引号 mm, dd, yyyy = date_str.split('/') row[1] = f"{yyyy}/{mm}/{dd}" # 转换为YYYY/MM/DD格式 writer.writerow(row)
这个方法能避免手动处理分隔符时的各种坑,适合生产环境的复杂数据。
内容的提问来源于stack exchange,提问作者GustavMahler
相关产品推荐
相关产品推荐

