我有以下文件:
foo,1460844122
bar,abcd
bla,efjhi
foo,1464834121
baz,jklmn
我想逐行阅读,只有当"foo"作为第一个单词出现时,才能将第二个单词(自epoch以来的秒数)转换为完整日期并输出foo:full-date。
如何使用Bash来完成此任务?
这个应该能做到:
while IFS=, read -r k v; do
if [[ $k == "foo" ]]; then
printf '%s:%sn' "$k" "$(date --date="@$v")"
fi
done < /path/to/your/file
如果已安装perl
:
perl -plE 's/^(foo),(d+)/"$1:" . localtime($2)/e' < file
对于您的数据,它会打印
foo:Sun Apr 17 00:02:02 2016
bar,abcd
bla,efjhi
foo:Thu Jun 2 04:22:01 2016
baz,jklmn
在awk:中
$ awk -F, '$1 == "foo" {printf "%s:%sn", $1, strftime("%c", $2)}' infile
foo:Sat, Apr 16, 2016 6:02:02 PM
foo:Wed, Jun 1, 2016 10:22:01 PM
strftime
函数的第一个参数控制日期/时间输出格式;%c
是您所在地区的"适当"日期和时间表示。如果我们想要更可排序的东西,我们可以使用ISO 8601日期格式和24小时时间表示,用T
:分隔
$ awk -F, '$1 == "foo" {printf "%s:%sn", $1, strftime("%FT%T", $2)}' infile
foo:2016-04-16T18:02:02
foo:2016-06-01T22:22:01