2010-12-14 24 views
8

Hi Cần một kịch bản để phân tích cú pháp thông qua các tập tin csv - từng dòng và sau đó trường bởi field]Shell script để phân tích thông qua một tập tin (csv) và dây chuyền chế biến bởi dòng

file sẽ trông giống như

này
X1,X2,X3,X4 
Y1,Y2,Y3,Y4 

tôi cần phải giải nén từng X1, X2 ....

tôi đã viết một kịch bản nhưng nó không thành công nếu hàng đã vượt quá một dòng ..

+2

Tin vui: hai chương trình, [awk] (http://www.vectorsite.net/tsawk.html) và [sed] (http://www.grymoire.com/Unix/Sed.html), tồn tại để làm chính xác điều đó. Tin xấu: họ không thể học được. Tôi không đặt câu trả lời này vì nó thực sự không phải; hy vọng một người nào đó bên dưới sẽ đăng cú pháp awk/sed chính xác để bạn sử dụng trong vấn đề cụ thể của mình. – eykanal

+1

'sed' có thể khó học, nhưng 'awk' thì không. Awk thực sự khá dễ dàng. Mặc dù bạn không cần phải thực hiện điều này, vì nó có thể được thực hiện với các trình xây dựng sẵn (xem phản hồi của Ignacio, bên dưới). –

Trả lời

27

đây là cách tôi sẽ làm điều đó.

Trước tiên, tôi đặt biến môi trường IFS để cho biết read rằng "," là dấu tách trường.

export IFS="," 

Với tập tin "đầu vào" chứa dữ liệu mà bạn cung cấp, tôi có thể sử dụng đoạn mã sau:

cat test | while read a b c d; do echo "$a:$b:$c:$d"; done 

Để nhanh chóng tóm tắt lại những gì đang xảy ra ở trên. cat test | đọc tệp và gửi đến while. while chạy mã giữa dodone trong khi read trả về giá trị đúng. read đọc một dòng từ đầu vào tiêu chuẩn và phân tách nó thành các biến ("a", "b", "c" và "d") theo giá trị của $ IFS. Cuối cùng, echo chỉ hiển thị các biến mà chúng tôi đã đọc.

nào mang lại cho tôi kết quả như sau

X1:X2:X3:X4 
Y1:Y2:Y3:Y4 

BTW, BASH manual luôn là đọc tốt. Bạn sẽ học một cái gì đó mới mỗi khi bạn đọc nó.

+4

[UUOC] (http://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat) - bạn không cần mèo đó :-) –

+1

@Chris: Tôi biết! Chỉ cần sở thích cá nhân, cho rõ ràng ... :-) –

+5

Bạn hầu như luôn luôn nên sử dụng '-r' với' read'. Bạn nên làm 'trong khi IFS = ',' đọc-r a b c d' và bạn sẽ không phải lưu và khôi phục giá trị của' IFS' để có hành vi của nó trở lại bình thường. Lưu ý rằng nếu có nhiều trường trong dữ liệu của bạn hơn bạn có các biến mà biến cuối cùng cũng sẽ chứa số dư thừa. –

3

Kể từ khi được đề cập đến AWK và sed, tôi nghĩ tôi sẽ cho bạn thấy cách bạn có thể sử dụng chúng.

awk -F, 'BEGIN{OFS="\n"}{$1=$1; print}' inputfile 

hoặc

sed 's/,/\n/' inputfile 

Sau đó, một kịch bản shell thể xử lý đầu ra của họ:

awk_or_sed_cmd | while read -r field 
do 
    do_something "$field" 
done 

Tất nhiên, bạn có thể làm quá trình xử lý trong kịch bản AWK:

awk -F, '{for (i=1;i<=NF;i++) do_something($i)}' inputfile 
0

ls -l

vi filename.sh

#!bin/sh

echo "ĐẦU VÀO MẪU"

mèo> kiểm tra (dữ liệu đầu vào và lưu nó)

kiểm tra con mèo | trong khi đọc (đầu vào), (ví dụ: "$ a: $ b: $ c: $ d");

làm

echo "mô hình hiển thị là "$ a: $ b: $ c: $ d" \ n"

exit (0;);

Các vấn đề liên quan