2016-04-11 2 views
0

Предположим, у меня есть .txt файл в моей базе данных UNIX: events.txt с 3-х столбцов и 4 записей следующим образом:Как добавить столбец в файл, значения которого эквивалентны преобразованию эпохи одного из датасочетаний уже в этом файле с помощью команд unix?

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 

Я хочу, чтобы редактировать эту таблицу или создать новую таблицу, которая должна содержать 4-й столбец назван DOB_epoch (как эпохи значения второго столбца DateOfBirth) как следующие:

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, чтобы создать такой столбец таблицы?

+0

Каковы ваши разделители столбцов? Это вкладки? Или файл имеет столбцы фиксированной ширины? Предполагая, что у вас есть GNU awk, см. Https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions –

+0

'/ me' пошатнулся, что вам нужно записать право на время рождения до миллисекунды! –

ответ

0

Довольно легко с петлей «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 

Для BSD, просто заменить временную метку линию:

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

Вы может сделать это довольно просто в коротком сценарии оболочки, используя read, date и printf. Например:

#!/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" 

Использование/Output

$ 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 (в противном случае удалите ее).

Смежные вопросы