我有文本文件。想要在 txt 文件中的时间/日期戳中添加逗号或将以下文本转换为 3 列中的 csv

我有文本文件。想要在 txt 文件中的时间/日期戳中添加逗号或将以下文本转换为 3 列中的 csv

我有文本文件。想要在时间/日期戳中添加逗号

$ cat sample.txt
 name1 [jdk]                 Mon Nov 01 12:14:04 EST 2004     Mon Jan 01 00:37:19 EST 2035

我想要如下所示的输出,并且需要转换为csv文件。

name1 [jdk],Mon Nov 01 12:14:04 EST 2004,Mon Jan 01 00:37:19 EST 2035

答案1

使用 GNU sed,无论您的空白是什么,也无论第一个日期之前出现什么文本:

$ sed -E 's/(.*\S)\s+((\S+\s+){5}\S+)\s+((\S+\s+){5}\S+)$/\1,\2,\4/' sample.txt
name1 [jdk],Mon Nov 01 12:14:04 EST 2004,Mon Jan 01 00:37:19 EST 2035

答案2

你不需awk要这样做:

cut --output-delimiter="," -c1-28,29-56,62- sample.txt | sed -e "s/ *,/,/"

cut将读取固定宽度文件并将其转换为分隔文件

sed将删除字段末尾的多余空格

答案3

awk '{gsub(/[[:space:]]{3,}/,",",$0);print }' file1

输出

name1 [jdk],Mon Nov 01 12:14:04 EST 2004,Mon Jan 01 00:37:19 EST 2035

答案4

您可能应该使用 awk,因为在其中您可以将奇数日期字符串更改为更有用的内容:纪元后以秒为单位的时间戳:

$ awk -F '[ \t:]' 'BEGIN{ m="JanFebMarAprMayJunJulAugSepOctNovDec" }
               { sub("^"FS,"")
                 mon1 = (match(m,$4)+2)/3;
                 sec1 = mktime($10" "mon1" "$5" "$6" "$7" "$8 );
                 mon2 = (match(m,$12)+2)/3;
                 sec2 = mktime($18" "mon2" "$13" "$14" "$15" "$16);
                 print( $1,$2,",",sec1,",",sec2 )
               }
    ' sample.txt

name1 [jdk] , 1099311244 , 2051224639

请注意,由于第二个参数1采用 mktime,因此时间戳采用 UTC 时间。如果时间戳是本地时间,则将其更改为 0。

相关内容