我每天导出大约 200-50 GB 的 CSV 文件。每个 CSV 文件的第一个字段都是类似的日期信息。每个 CSV 文件有 22 个字段
/data/exported$ head 0000_processmessages_export_20170509_000144.csv | awk -F ";" '{print $1}'
2017-05-08T21:59:10.263Z
2017-05-08T21:59:10.000Z
2017-05-08T21:59:10.000Z
2017-05-08T18:59:11.000Z
2017-05-08T18:59:11.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
所以基本上我想在 csv 文件中的每行末尾添加 2 个字段(Field22 和 Field23),这些字段如 YYYYDDMMHH 和 YYYYMMDD 格式,我必须从行中的第一个字段中提取它们。所以
Field 23 Field 24
2017050821 20170508
2017050821 20170508
2017050821 20170508
2017050818 20170508
2017050818 20170508
2017050821 20170508
2017050821 20170508
2017050821 20170508
2017050821 20170508
2017050821 20170508
如何使用 sed 和/或 bash 命令来做到这一点?
答案1
正如评论中提到的,拥有这样的冗余信息似乎很愚蠢。但如果您确实需要这样做,请使用捕获组和反向引用:
sed 's/^\(....\)-\(..\)-\(..\)T\(..\).*/&;\1\2\3\4;\1\2\3/'
答案2
perl -F\; -pale '$_ .= join ";", q{}, $F[0] =~ tr/T-//dr =~ /^((\d{8})\d{2})/' CSV.file
答案3
您的输入似乎是;
- 分隔的,所以我假设您希望输出也有类似的分隔。
$ cat file.csv
2017-05-08T21:59:10.263Z;some;other;fields
2017-05-08T21:59:10.000Z;some;other;fields
2017-05-08T21:59:10.000Z;some;other;fields
2017-05-08T18:59:11.000Z;some;other;fields
2017-05-08T18:59:11.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
$ awk -F ';' -v OFS=';' '{ split($1,a,":"); gsub("[^0-9]","",a[1]); $(NF+1)=a[1]; $(NF+1)=substr(a[1],0,8); print}' file.csv
2017-05-08T21:59:10.263Z;some;other;fields;2017050821;20170508
2017-05-08T21:59:10.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:59:10.000Z;some;other;fields;2017050821;20170508
2017-05-08T18:59:11.000Z;some;other;fields;2017050818;20170508
2017-05-08T18:59:11.000Z;some;other;fields;2017050818;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
该awk
程序采用第一个;
- 分隔字段并将其拆分为:
。然后,它从字段的第一部分(第一个 之前的位)中删除所有非数字,:
并将其作为新字段添加到末尾。然后,第二个新字段将附加到该行末尾,仅包含第一个新字段的前八个字符。然后打印新行。