与GNU sed
sed -E '2,$ s/(("[^"]*",){4})("[^"]+")(.*)/echo \x27\1"\x27$(date -d \3 +%s)\x27"\4\x27/e'
-
2,$ 跳过标头处理
-
(("[^"]*",){4})前四列
-
("[^"]+")第五栏
-
(.*) 其余行
-
echo \x27\1"\x27 和 \x27"\4\x27 保留前四列和第五列之后的其余行,并在日期转换结果中添加双引号
-
$(date -d \3 +%s) 调用带有第五列值的 shell 命令
请注意,如果输入可以包含单引号,此命令将失败。这可以通过使用s/\x27/\x27\\&\x27/g 来解决。
您可以使用-n 选项和pe 标志查看执行的命令
sed -nE '2,$ s/(("[^"]*",){4})("[^"]+")(.*)/echo \x27\1"\x27$(date -d \3 +%s)\x27"\4\x27/pe'
会给
echo '"58.75","5.33","kg","7","'$(date -d "2020-7-11 19:29:29" +%s)'","5"'
对于58.25,5.89, kg, 7,2020 / 7/12 11:23:46, "5"格式,试试
sed -E '2,$ s/(([^,]*,){4})([^,]+)(.*)/echo \x27\1\x27$(date -d "\3" +%s)\x27\4\x27/e'
或(改编自https://stackoverflow.com/a/62862416)
awk 'BEGIN{FS=OFS=","} NR>1{$5=mktime(gensub(/[:\/]/, " ", "g", $5))} 1'
注意:对于sed 解决方案,如果输入可能来自外部来源,则必须小心避免cmets 中提到的恶意意图。一种方法是使用[0-9: -]+ 或类似名称匹配第五列。