Perl 如何将一个满是unix时间字符串的文件转换为人类可读的日期?

Perl 如何将一个满是unix时间字符串的文件转换为人类可读的日期?,perl,bash,unix-timestamp,Perl,Bash,Unix Timestamp,我正在处理一个满是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 这是行不通的。对于每一行,我得到的

我正在处理一个满是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
这是行不通的。对于每一行,我得到的输出是1970年1月1日星期四00:00:00。我认为断线被发现了,这就是它不起作用的原因。有什么想法吗?我使用的是Mac OSX,这很重要。

不需要Perl:

awk '{ print strftime("%c", $0) }' somefile.txt
$perl-lne'print scalar gmtime$\ux'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
Sun Jul 23 07:36:51 2006因为
$line
在单引号中,所以它没有被bash处理,因此
$line
被视为(未定义的)Perl变量,而不是bash变量

读取时不需要
bash循环;Perl可以使用其
-n
选项自行完成循环

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

(使用-E启用
比如说
,它会自动追加换行)

问题是您没有为
$line
变量分配任何内容,因此它默认为零值,这就是为什么您总是将1970年1月1日星期四00:00:00作为输出的原因


与Perl中的一样流畅。

GNU日期/xargs解决方案:

  xargs -i  date -d "1970-01-01 00:00:00 {} seconds"  </tmp/timestamps 

xargs-i date-d“1970-01-01 00:00:00{}秒”不要使用
cat

#! /bin/bash
file="test.txt"
while read line
do
    date -d @$line
done < "$file"
#/bin/bash
file=“test.txt”
读行时
做
日期-d@$行
完成<“$file”

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

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

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

这个简单的命令就可以了

 cat time.txt | while read line; do date -ud @$line; done > string.txt

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

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

Perl代码:

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

    $humantime = Wed Nov 26 15:08:27 2014 

或者
-lne
对于5.10之前版本的PerlI,它已经习惯于与
战斗,就像你但我停止一样。我发现它在命令行工作中非常实用
cat foo | grep bar |……
似乎比
更好,如果你想获得一个无用的cat使用奖,你就不能避开cat。@brian:我有一个装满它们的架子。有几个好答案。但我不得不把它交给巴肯。这一班机真是太棒了。谢谢大家的帮助。如果我没有混合使用bash和perl,那会更好。@skymook谢谢!我很高兴它能帮上忙。golfed:
perl-lpe'$\gmtime$\u'test.txt
也不需要awk。Perl解决方案和awk解决方案基本上是一样的。
    $humantime = Wed Nov 26 15:08:27 2014