2012-02-28 7 views
8

Tôi có một tập tin mà trông như thế này:Tại sao awk không in ra dòng mới?

1 
2 
AA 
4 
5 
AA BB 
7 
8 
AA BB CC 
10 
11 
AA BB CC DD 

Tôi đang sử dụng awk để trích xuất chỉ có mỗi nth dòng nơi n=3.

>>awk 'NR%3==0' /input/file_foo >> output/file_foobar 

Sản lượng xuất hiện trong một dòng duy nhất là:

AA AA BB AA BB CC AA BB CC DD 

..... và vân vân

Tôi muốn nó xuất hiện như:

AA 
AA BB 
AA BB CC 
AA BB CC DD 

Tôi đã thử sử dụng \n, printf với \n, v.v. nhưng nó không hoạt động như tôi mong đợi. Xin cho biết.

+2

Bạn đang sử dụng trình bao nào? Đó là một lời nhắc sáng chế mà không chỉ ra loại vỏ. Làm thế nào bạn chứng minh rằng dữ liệu là bằng phẳng trên một dòng? –

+1

Bạn đã thử thay đổi biến RS chưa? –

+0

Cảm ơn. Tôi đã sử dụng Cygwin nhưng người kết thúc dòng không đúng như Shiplu đã đề cập. – mane

Trả lời

8

Một cách tiết,

awk '{ if (NR%3==0) { print $0} }' 

Ngoài ra bạn có thể sử dụng {printf("%s\n\n", $0)} quá. nếu đơn \n không hoạt động.

Nếu vẫn không hoạt động, bạn có thể cần kiểm tra trình kết thúc dòng. Nó có thể không đúng. Sử dụng biến số RS trong awk để tách biệt trên trình kết thúc dòng bất thường.

+0

Dường như không hoạt động. Cái thứ hai tạo ra một số lỗi. cái đầu tiên không in kết quả chính xác. Tôi thực sự muốn sao chép mỗi dòng thứ ba trong một tập tin vào một tập tin khác, đó là tất cả. – mane

+1

Tôi nghĩ rằng trình kết thúc dòng tệp của bạn không phù hợp. –

+0

Cảm ơn Shiplu. Người kết thúc dòng không đúng. Nó hoạt dộng bây giờ. – mane

2

Sử dụng sau đây với print cho mỗi dòng:

awk 'NR%3==0 { print $0 }' /input/file_foo >> output/file_foobar 
3

Tôi nghĩ rằng vấn đề là ở cách bạn đang hiển thị các dữ liệu, không phải trong quá trình xử lý.

$ cat x 
1 
2 
AA 
4 
5 
AA BB 
7 
8 
AA BB CC 
10 
11 
AA BB CC DD 
$ awk 'NR%3==0' x 
AA 
AA BB 
AA BB CC 
AA BB CC DD 
$ 

tôi nghi ngờ rằng những gì bạn đang làm là tương tự như:

$ awk 'NR%3==0' x > y 
$ x=$(<y) 
$ echo $x 
AA AA BB AA BB CC AA BB CC DD 
$ echo "$x" 
AA 
AA BB 
AA BB CC 
AA BB CC DD 
$ 

Điều này sẽ làm bạn bối rối. Xem thêm: Capturing multi-line output to a bash variable.

+0

Điều này hoạt động tốt. Cảm ơn – mane