假设我的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`
您可以使用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_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
选项(否则,请将其删除)。