AWK để chia dòng một và dòng 2

Sep 09 2020

Sau một số grep và awk, tôi có phần mở rộng sau.

 [root@nalba ~]# mysql -e "show global status like '%innodb_buffer_pool_read%';" | grep s | awk '{print $2}'

835231
2893

Tôi chỉ muốn chia 835231/2893.

Tuy nhiên, những con số này sẽ thay đổi mỗi khi lệnh được chạy vì vậy tôi chỉ cần nói với awk cách chia dòng 1 và 2 hoặc bằng cách nào đó lưu trữ chúng trong một biến.

Hầu hết các hướng dẫn trực tuyến chỉ hiển thị cho bạn cách chia theo cột. (awk '{print $ 1 / $ 2) nhưng điều đó sẽ không hoạt động trong trường hợp này.

Cám ơn vì ghé qua!

Trả lời

1 Cyrus Sep 09 2020 at 02:31

Thêm vào lệnh của bạn:

| awk '{a=$1; getline; b=$1; print a/b}'

Cập nhật để tránh lỗi chia cho 0:

| awk '{a=$1; getline; b=$1; if(b==0){print "error"} else {print a/b}}'

Đầu ra:

288.708
2 EdMorton Sep 09 2020 at 03:35

Thay thế | grep s | awk '{print $2}'bằng:

| awk '/s/{v[++c]=$2} c==2{print (v[2] ? v[1] / v[2] : "NaN"); exit}'
1 ToddA.Jacobs Sep 09 2020 at 02:22

Lưu trữ các giá trị trong Mảng; Phân chia trong khối cuối

Nếu bạn biết sẽ luôn có chính xác hai giá trị hoặc bạn chỉ quan tâm đến hai kết quả phù hợp đầu tiên, thì bạn có thể lưu trữ các giá trị trong một mảng kết hợp và thực hiện phép chia của bạn ở cuối. Ví dụ:

test_data="foo 835231\nbar 2893"
echo -e "$test_data" | awk '{ values[NR] = $2 }; END { print values[1] / values[2] }'

Điều này mang lại 288.708.

Nếu bạn vẫn đang truy vấn cơ sở dữ liệu, bạn có thể tốt hơn nên tạo một truy vấn SQL yêu cầu cơ sở dữ liệu thực hiện phân chia cho bạn. Đừng bao giờ trực tiếp tìm kiếm kết quả truy vấn khi bạn có thể nhận được cơ sở dữ liệu để thực hiện công việc cho mình.