2012-03-06 35 views
14

Tôi có một tập tin như thế này:cắt lệnh xuống dòng

one 
two 
three 
four 

Tôi muốn sử dụng một vòng lặp for trong một kịch bản bash để quét dòng file cho dòng. Trước đây tôi đã sử dụng cut nhưng tôi không thể đưa ra lệnh cut dấu phân tách dòng mới, làm cách nào tôi có thể?

Bằng cách này nó không hoạt động:

cut -d'\n' -f1 

Bất kỳ đề nghị?

Trả lời

11

Sử dụng cat cho concatenating hoặc hiển thị. Không cần thiết ở đây:

while read line ; do 
    echo "$line" 
done < file 
+0

Tôi đồng ý với điều này, nhưng điều này là đáng chú ý chậm hơn so với cách tiếp cận 'cắt'. –

1
cat FILE|while read line; do # 'line' is the variable name 
    echo "$line" # do something here 
done 

hoặc (xem bình luận):

while read line; do # 'line' is the variable name 
    echo "$line" # do something here 
done < FILE 
+2

[UUOC] (http://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat) - sử dụng 'while ... done Kevin

+0

Nó không phải là vô ích, nó có lẽ lãng phí (sau khi đọc đoạn này), nhưng nó cũng dễ đọc hơn IMO. – 0xC0000022L

-1

Ý kiến ​​của tôi là "cắt" sử dụng '\ n' làm dấu phân cách mặc định của nó. Nếu bạn muốn sử dụng cắt, tôi có hai cách:

cut -d^M -f1 file_cut 

tôi làm^M By nhấn Enter Sau khi Ctrl + V. Một cách khác là

cut -c 1- file_cut 

Điều đó có hữu ích không?

+0

Thật không may, không có điều nào ở trên phù hợp với tôi (bash, phiên bản 4.2.45). –

39

tôi tìm thấy bản thân mình trong cùng một vấn đề, điều này làm việc cho tôi:

cat file.cut | cut -d$'\n' -f1 

Hoặc:

cut -d$'\n' -f1 file.cut 
+0

Điều này được thực hiện tốt cho tôi :) cảm ơn – Sina

3

Đơn giản chỉ cần sử dụng:

echo -n `cut ...` 

này sẽ bỏ qua \ n tại kết thúc

1

Vì vậy, som e thực sự tốt (có thể tốt hơn) câu trả lời đã được cung cấp rồi. Nhưng khi nhìn vào câu hỏi ban đầu, khi muốn sử dụng BASH for-loop, tôi ngạc nhiên rằng không ai đề cập đến giải pháp với sự thay đổi của Field Separator IFS. Đó là giải pháp bash thuần túy, giống như dòng đọc được chấp nhận

old_IFS=$IFS 
IFS='\n' 
for field in $(<filename) 
do your_thing; 
done 
IFS=$old_IFS 
Các vấn đề liên quan