Tôi đang cố chuyển đổi HTML chứa bảng thành tệp .csv bằng cách sử dụng tập lệnh bash
.Sử dụng sed hoặc awk để sửa định dạng ngày
Cho đến nay tôi đã acomplished các bước sau:
- Chuyển đổi sang định dạng Unix (với
dos2unix
) - Hủy bỏ tất cả không gian và các tab (với
sed 's/[ \t]//g'
) - Hủy bỏ tất cả các dòng trống (với
sed ':a;N;$!ba;s/\n//g'
) (điều này là cần thiết, vì tệp HTML có một dòng trống cho mỗi ô của bảng ... đó không phải là lỗi của tôi) - Xóa các bộ sưu tập không cần thiết
<td>
và<tr>
(với)) - Thay
</td>
với '' (vớised 's/<\/td/,/g'
) - Thay
</tr>
với (\n
) ký tự end-of-line (vớised 's/<\/tr/\n/g'
)
Tất nhiên, tôi đặt tất cả điều này trong một đường ống. Cho đến nay, nó hoạt động rất tốt. Có một bước cuối cùng tôi bị mắc kẹt: Bảng có một cột có ngày, có định dạng dd/mm/yyyy
và tôi muốn chuyển đổi chúng thành yyyy-mm-dd
.
Có cách nào (đơn giản) để làm điều đó (với sed
hoặc awk
)?
mẫu dữ liệu (sau khi toàn bộ sed
ống):
500,2,13/09/2007,30000.00,12,B-1
501,2,15/09/2007,14000.00,8,B-2
Dự kiến kết quả:
500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
Lý do tôi cần phải làm điều này là bởi vì tôi cần phải nhập dữ liệu này sang MySQL. Tôi có thể mở tập tin trong Excel và thay đổi định dạng bằng tay, nhưng tôi muốn bỏ qua nó.
Tốt, nhưng lệnh 'đọc' dựa trên sẽ không hoạt động, vì' đọc' chạy trong _subshell_ trong trường hợp này; sử dụng 'echo '08/26/2013' | {IFS =/đọc m d y; echo "$ {y} - $ {m} - $ {d}"; } 'hoặc ' IFS =/đọc m d y <<< '26/08/2013'; echo "$ {y} - $ {m} - $ {d}" ' – mklement0
@ mklement0 Ah, vâng .... quên mất chi tiết nhỏ đó. Nó sẽ hoạt động trong 'ksh'. Một phương án khác sẽ là 'IFS =/read m d y <<(echo 08/26/2013)' để tránh subshell (mặc dù 'echo' sẽ nằm trong một subshell). – twalberg
Điểm tốt, mặc dù '<<<' có lẽ là hiệu quả nhất ở đây. Trong Bash v4.2 + bạn cũng có thể sử dụng 'shopt -s lastpipe' (nhưng chỉ trong các script). Tôi có thể đề nghị bạn cập nhật câu trả lời của mình bằng một trong các giải pháp làm việc không? – mklement0