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

Shell 如何使用unix命令在文件中添加一列,该列的值相当于该文件中已存在的日期列之一的历元转换?,shell,datetime,unix,unix-timestamp,dos2unix,Shell,Datetime,Unix,Unix Timestamp,Dos2unix,假设我的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

假设我的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
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
我想编辑此表或创建一个新表,该表必须包含名为DOB_epoch的第4列(作为第2列DateofBirth的历元值),如下所示:

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
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 "$line\t$timestamp" >> events2.txt
    else
        echo -e "$line\tDOB_epoch" >> events2.txt
    fi
done < events.txt
timestamp=`date -j -f "%Y-%m-%d %H:%M:%S" "$timedate" +%s`

您可以使用
read
date
printf
在一个简短的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_epoch\n" "$nm" "$dt" "$tm"
        c=1
        continue
    }
    epoch=$(date -d "${dt} ${tm}" +%s)
    printf "%-8s %-30s %-10s %s\n" "$nm" "$dt $tm" "$ci" "$epoch"
done < "$fname"

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

您的列分隔符是什么?是标签吗?或者文件是否有固定宽度的列?假设您有GNU awk,请参见
/me
您需要将出生时间记录到毫秒!