另一个 sed 问题

另一个 sed 问题

我每天导出大约 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程序采用第一个;- 分隔字段并将其拆分为:。然后,它从字段的第一部分(第一个 之前的位)中删除所有非数字,:并将其作为新字段添加到末尾。然后,第二个新字段将附加到该行末尾,仅包含第一个新字段的前八个字符。然后打印新行。

相关内容