2016-04-11 26 views
0

Ben bir .txt benim Unix veritabanında dosya var varsayalım:Unix komutlarını kullanarak bu dosyada bulunan tarih colmn öğelerinden birinin dönüşümüne karşılık gelen değerleri içeren bir dosyaya sütun nasıl eklenir?

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 

Ben bu tabloyu düzenlemek veya 4 sütun içermelidir yeni bir tablo oluşturmak istiyorum: aşağıdaki gibi 3 sütun ve 4 kayıtlarıyla events.txt

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 

ne tür tablo sütunu oluşturmak için unix komut olmalıdır: DOB_epoch olarak aşağıdaki gibi (2 sütun DateOfBirth çağı değeri olarak) adında?

+0

Sütun ayırıcılarınız nelerdir? Sekmeler mi? Veya dosya sabit genişlik sütunları var mı? GNU awk'ınız varsa, bkz. Https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions –

+0

'/ me', doğum tarihini doğru olarak kaydetmeniz gerektiğini belirtti. milisaniyeye kadar! –

cevap

0

"while" döngüsü ile oldukça kolay. Sadece ile zaman damgası çizgisini değiştirmek, BSD için

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

: Linux için

: bir "events2.txt" dosyası oluşturmak istiyorum varsayarsak

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

Sen read, date ve printf'u kullanarak kısa bir kabuk komut dosyasında oldukça basit bir şekilde yapabilirsiniz. Örneğin: bir karakter ya da iki tarafından printf alan genişliği değiştiricileri ayarlamanız gerekebilir böylece

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

Kullanımı/Çıktı

$ 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 

ben Aralık için karakterleri saymak değil. read sürümünüzün -r seçeneklerini desteklediğinden emin olmak için kontrol edin (aksi halde kaldırın).