2011-11-25 46 views
6

Tôi đang cố gắng tạo tập lệnh để chuyển đổi hai cột trong tệp .csv là ngày và giờ thành dấu thời gian unix. Vì vậy, tôi cần phải lấy cột ngày tháng và thời gian từ mỗi hàng, chuyển đổi nó và chèn nó vào một cột bổ sung ở cuối chứa dấu thời gian.Tập lệnh Bash để chuyển đổi cột ngày và giờ thành dấu thời gian trong .csv

Có ai có thể giúp tôi không? Cho đến nay tôi đã khám phá ra lệnh unix để chuyển đổi bất kỳ đưa ra thời gian và ngày để unixstamp:

date -d "2011/11/25 10:00:00" "+%s" 
1322215200 

Tôi không có kinh nghiệm với bash kịch bản có thể bất cứ ai cho tôi bắt đầu?

Ví dụ về các cột và hàng của tôi:

Columns: Date, Time, 
Row 1: 25/10/2011, 10:54:36, 
Row 2: 25/10/2011, 11:15:17, 
Row 3: 26/10/2011, 01:04:39, 

Cảm ơn rất nhiều trước!

+0

Bạn có thể bao gồm một vài ví dụ về tệp csv của mình không? – ajreal

+0

Điều chắc chắn, thêm nó vào câu hỏi, cổ vũ –

+0

Chỉ chuyển đổi mà không phân tích cú pháp một phần: http://stackoverflow.com/questions/10990949/convert-date-time-string-to-unix-timestamp-in-bash-command –

Trả lời

1

này nên thực hiện công việc:

awk 'BEGIN{FS=OFS=", "}{t=$1" "$2; "date -d \""t"\" +%s"|getline d; print $1,$2,d}' yourCSV.csv 

lưu ý

bạn đã không đưa ra bất kỳ ví dụ. và bạn đã đề cập đến csv, vì vậy tôi giả định rằng dấu tách cột trong tệp của bạn phải là "dấu phẩy".

kiểm tra

kent$ echo "2011/11/25, 10:00:00"|awk 'BEGIN{FS=OFS=", "}{t=$1" "$2; "date -d \""t"\" +%s"|getline d; print $1,$2,d}' 
2011/11/25, 10:00:00, 1322211600 
7

Bạn không cung cấp một exerpt từ csv file của bạn, vì vậy tôi đang sử dụng này một:

[foo.csv] 
2011/11/25;12:00:00 
2010/11/25;13:00:00 
2009/11/25;19:00:00 

Dưới đây là một cách để giải quyết vấn đề của bạn:

$ cat foo.csv | while read line ; do echo $line\;$(date -d "${line//;/ }" "+%s") ; done 
2011/11/25;12:00:00;1322218800 
2010/11/25;13:00:00;1290686400 
2009/11/25;19:00:00;1259172000 

(EDIT: Removed một biến uneccessary)

(EDIT2:.. Altered lệnh cập nhật để kịch bản thực sự hoạt động)

+0

Cảm ơn cho bạn giúp đỡ: Tôi đã đặt điều này vào một kịch bản shell như sau: #!/ltd/bin/bash cat myfile.csv | trong khi đọc dòng; do t = $ (echo $ line | tr ',' ''); echo $ line \; $ (ngày -d "$ t" "+% s"); tôi đã nhận được các tùy chọn lỗi bất hợp pháp - khi tôi chạy nó? Ngoài ra tôi có quyền giả sử tôi cần phải thay thế ';' với ',' như tôi có một tập tin phân cách bằng dấu phẩy không bán đại tràng sperated? –

+0

Chạy nó như là một oneliner và kiểm tra nó trước khi đặt nó trong một tập lệnh-kịch bản để xem nếu nó làm việc cho bạn. Và có, bạn cần thay đổi '';'' thành '','' nếu bạn sử dụng dấu phẩy phân tách tệp csv. – bos

+1

@bos bạn có thể rút ngắn phần vòng lặp của vòng lặp while với 'echo $ {line} \; $ (ngày -d" $ {line //; /} "+ '% s');" Không cần phải lặp lại và tr để có được chuỗi ngày đúng. Vì vậy, điều này có thể được thực hiện tại chỗ. – f4m8

2

Bây giờ hai imporvements:

Đầu tiên: Không cần cho mèo foo.csv, chỉ phát trực tiếp qua < foo.csv vào vòng lặp while.

Thứ hai: Không cần phải echo & tr để tạo ngày định dạng chuỗi. Chỉ cần sử dụng mẫu nội bộ bash và thay thế và thực hiện tại chỗ

while read line ; do echo ${line}\;$(date -d "${line//;/ }" +'%s'); done < foo.csv 
Các vấn đề liên quan