2011-08-09 32 views
18

Có thể làm một cái gì đó như thế này:Looping trên các lĩnh vực đầu vào như mảng

$ cat foo.txt 
1 2 3 4 
foo bar baz 
hello world 
$ awk '{ for(i in $){ print $[i]; } }' foo.txt 
1 
2 
3 
4 
foo 
bar 
baz 
hello 
world 

Tôi biết bạn có thể làm điều này:

$ awk '{ split($0,array," "); for(i in array){ print array[i]; } }' foo.txt 
2 
3 
4 
1 
bar 
baz 
foo 
world 
hello 

Nhưng sau đó kết quả là không theo thứ tự.

+0

Có, mảng liên kết là các bộ sưu tập không có thứ tự. –

Trả lời

40

Phát hiện ra bản thân mình:

$ awk '{ for(i = 1; i <= NF; i++) { print $i; } }' foo.txt 
+0

Lưu ý rằng bạn có thể xóa dấu ngoặc trong 'for' vì bạn đang thực thi chỉ một lệnh. – fedorqui

1

Tôi muốn sử dụng sed:

sed 's/\ /\n/g' foo.txt 
+0

Không hoạt động bởi vì tôi cần phải thao tác các trường tách trong awk. Hoặc sau đó tôi phải liên quan đến sed và awk – Tyilo

0

Nếu bạn đang mở để sử dụng Perl, một trong những nên làm các trick:

perl -lane 'print $_ for @F' foo.txt 
perl -lane 'print join "\n",@F' foo.txt 

Các tùy chọn dòng lệnh này được sử dụng:

  • -n vòng quanh mỗi dòng của tập tin đầu vào, không tự động in dòng
  • -l loại bỏ dòng mới trước khi chế biến, và cho biết thêm họ trở về sau
  • -a chế độ autosplit - dòng đầu vào chia thành các mảng @F. Mặc định là chia tách trên khoảng trắng.
  • -e thực thi mã perl
0

Không cần awk, sed hoặc perl. Bạn có thể dễ dàng thực hiện việc này trực tiếp trong trình bao:

for i in $(cat foo.txt); do echo "$i"; done 
Các vấn đề liên quan