Shell 如何使用unix命令在文件中添加一列,该列的值相当于该文件中已存在的日期列之一的历元转换?
假设我的unix数据库中有一个.txt文件:events.txt,包含3列和4条记录,如下所示: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
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
您需要将出生时间记录到毫秒!