如何使用unix命令在文件中添加一列,该列的值相当于该文件中已存在的日期colmn之一的epoch转换



假设我的unix数据库中有一个.txt文件:events.txt,其中有3列和4条记录,如下所示:

Name     DateofBirth                           City
Alex     2016-02-22 15:12:21.244000            London
John     2016-02-24 15:12:21.244000            Paris
Harry    2016-02-23 16:17:21.254000            Moscow
Karry    2016-02-23 11:12:21.271000            Berlin

我想编辑这个表或创建一个新表,它必须包含一个名为DOB_epoch的第四列(作为第二列出生日期的epoch值),如下所示:

Name     DateofBirth                           City       DOB_epoch
Alex     2016-02-22 15:12:21.244000            London     9632587410
John     2016-02-24 15:12:21.244000            Paris      9871236540
Harry    2016-02-23 16:17:21.254000            Moscow     9478523690
Karry    2016-02-23 11:12:21.271000            Berlin     9321456870

在unix中创建这样的表列的命令应该是什么?

使用"while"循环非常容易。假设您想要生成一个"events2.txt"文件:

对于Linux:

#!/bin/bash
while read line;
do
    timedate=`echo $line | egrep -o "20.*[0-9]" | cut -d '.' -f 1`
    if [[ $timedate ]]
    then
        timestamp=`date -d"$timedate" +%s`
        echo -e "$linet$timestamp" >> events2.txt
    else
        echo -e "$linetDOB_epoch" >> events2.txt
    fi
done < events.txt

对于BSD,只需将时间戳行替换为:

timestamp=`date -j -f "%Y-%m-%d %H:%M:%S" "$timedate" +%s`

您可以使用readdateprintf在一个简短的shell脚本中非常简单地完成此操作。例如:

#!/bin/sh
fname=${1:-/dev/stdin}
c=0
while read -r nm dt tm ci; do
    [ "$c" -eq '0' ] && {
        printf "%-8s %-30s %-10s DOB_epochn" "$nm" "$dt" "$tm"
        c=1
        continue
    }
    epoch=$(date -d "${dt} ${tm}" +%s)
    printf "%-8s %-30s %-10s %sn" "$nm" "$dt $tm" "$ci" "$epoch"
done < "$fname"

使用/输出

$ sh epochbd.sh dat/epochbd.txt
Name     DateofBirth                    City       DOB_epoch
Alex     2016-02-22 15:12:21.244000     London     1456175541
John     2016-02-24 15:12:21.244000     Paris      1456348341
Harry    2016-02-23 16:17:21.254000     Moscow     1456265841
Karry    2016-02-23 11:12:21.271000     Berlin     1456247541

我没有计算字符的间距,所以您可能需要将printf字段宽度修饰符调整一两个字符。检查以确保您的read版本支持-r选项(否则,请将其删除)。

最新更新