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 'print scalar gmtime $_' test.txt
水曜日 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 2006
于 2010-05-17T14:20:55.413 に答える
3

は単一引用符で囲まれているため$line、bash によって処理されず$line、bash 変数ではなく (未定義の) Perl 変数として扱われます。

while readbash ループは必要ありません。-nPerl は、そのオプションを使用してループ自体を行うことができます。

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

改行ではなく、Perl スクリプト内の変数がbash スクリプト内の$line変数とは異なるということです。$lineあなたは試すことができます:

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

bash が変数補間を実行できるようにする二重引用符に注意してください。

于 2010-05-17T21:03:51.003 に答える
0

この簡単なコマンドで

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

GNU 日付/xargs ソリューション:

  xargs -i  date -d "1970-01-01 00:00:00 {} seconds"  </tmp/timestamps 
于 2010-05-17T15:14:38.233 に答える
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 に答える