4

我正在处理一个充满 unix 时间字符串的文件。我想将它们全部转换为人类可读的。

该文件如下所示:

1153335401
1153448586
1153476729
1153494310
1153603662
1153640211

这是脚本:

#! /bin/bash
FILE="test.txt"
cat $FILE | while read line; do
perl -e 'print scalar(gmtime($line)), "\n"'
done

这是行不通的。我得到的输出是Thu Jan 1 00:00:00 1970每一行。我认为换行符正在被拾取,这就是它不起作用的原因。有任何想法吗?我使用的是 Mac OSX,这有什么不同。

4

9 回答 9

9
$ perl -lne '打印标量 gmtime $_' test.txt
2006 年 7 月 19 日星期三 18:56:41
2006 年 7 月 21 日星期五 02:23:06
2006 年 7 月 21 日星期五 10:12:09
2006 年 7 月 21 日星期五 15:05:10
2006 年 7 月 22 日星期六 21:27:42
2006 年 7 月 23 日星期日 07:36:51
于 2010-05-17T14:20:55.413 回答
3

因为$line是单引号,所以它没有被 bash 处理,因此$line被视为(未定义的)Perl 变量而不是 bash 变量。

您不需要while readbash 循环;Perl 可以使用它的-n选项进行循环。

perl -nE 'say scalar(gmtime($_))' test.txt

(使用 -E 启用say,它会自动附加一个换行符)

于 2010-05-17T14:24:38.727 回答
1

不要使用cat.

#! /bin/bash
file="test.txt"
while read line
do
    date -d @$line
done < "$file"
于 2010-05-17T15:15:18.347 回答
1

这不是换行符,而是$linePerl 脚本内部的变量$line与 bash 脚本中的变量不同。你可以试试:

perl -e "print scalar(gmtime($line)),qq/\\n/"

注意双引号,它允许 bash 进行变量插值。

于 2010-05-17T21:03:51.003 回答
0

不需要 Perl:

awk '{ print strftime("%c", $0) }' somefile.txt
于 2010-05-17T14:19:54.850 回答
0

问题是您没有为$line变量分配任何内容,因此它默认为零值,这就是为什么您总是将Thu Jan 1 00:00:00 1970作为输出。

gbacon 的答案与 Perl 中的答案差不多。

于 2010-05-17T14:27:18.063 回答
0

GNU 日期/xargs 解决方案:

  xargs -i  date -d "1970-01-01 00:00:00 {} seconds"  </tmp/timestamps 
于 2010-05-17T15:14:38.233 回答
0

这个简单的命令就可以了

 cat time.txt | while read line; do date -ud @$line; done > string.txt
于 2010-08-19T18:48:51.350 回答
0

不要忘记在 Perl 中可以使用 localtime() 代替 gmtime()

所以,如果你冬天不在格林威治,你可以使用 localtime(),例如

Perl代码:

    my $unixtime = 1417014507;
    my $humantime = localtime($unixtime);
    print "\$humantime = $humantime \n";

输出:

    $humantime = Wed Nov 26 15:08:27 2014 
于 2014-11-26T15:17:44.797 回答