xóa các dòng trong đó giá trị của một trường nhỏ hơn hoặc bằng 3 - sed hoặc awk?


17

Tôi cần xóa mọi dòng có giá trị từ 2 trở xuống trong trường thứ 8 (cột).

Dữ liệu của tôi trông như thế này:

12-31   Airport 189 379 41  49.70946503 -124.91377258   2   2880    30.8
01-01   AlberniElementary   165 331 16  49.26100922 -124.80662537   4   5760    26.1
01-09   BamfieldMarine  161 323 23  48.83490372 -125.13572693   2   2875    27.4
01-10   BamfieldMarine  161 323 23  48.83490372 -125.13572693   3   3068    38.6

Tôi hiểu rằng bằng cách sử dụng awk tôi có thể loại bỏ các giá trị mong muốn và in chúng sang tệp khác và tôi hiểu rằng sed sẽ chỉnh sửa tệp hiện tại. Trong cả hai trường hợp, tôi cần giữ lại tệp gốc.

Lưu ý : Vui lòng cung cấp giải thích kỹ lưỡng với các giải pháp của bạn. Nó không đủ để chỉ viết lệnh, xin vui lòng chú thích các đề xuất.

Lưu ý thêm : Dữ liệu có dòng tiêu đề, vì vậy rất có thể giải pháp sẽ cần

awk 'FNR> 1'

Tôi giả sử?

Câu trả lời:


19

Bạn gần như đã có nó.

 awk '(NR>1) && ($8 > 2 ) ' foo > bar

Ở đâu

  • NR là số lượng bản ghi (đó là số dòng)
  • $8 là tám lĩnh vực
  • && là hợp lý và
  • foo là tập tin gốc, không thay đổi
  • bar tập tin kết quả
  • hành động mặc định ngầm là in dòng đầu vào hiện tại

Lưu ý rằng tiêu đề được sọc từ foo đến thanh, để giữ cho nó

 awk '(NR==1) || ($8 > 2 ) ' foo > bar

Ở đâu

  • || là hợp lý hoặc
  • dòng đầu vào được in nếu NR == 1 hoặc nếu $ 8> 2

Cập nhật số 1

Để chỉ định một phạm vi

  • ( ($8 >= -4) && ( $8 <= 4 ) ) Trường thứ 8 từ -4 đến 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) giống nhau, bao gồm cả tiêu đề

Câu trả lời tuyệt vời: đơn giản nhưng kỹ lưỡng, cảm ơn. Tôi đã rõ, sự khác biệt giữa FNR và NR trong trường hợp này là không có gì, đúng không? Tôi đã đọc trang man nơi nó giải thích: số thứ tự NR của bản ghi hiện tại & số thứ tự FNR của bản ghi hiện tại trong tệp hiện tại. Vì vậy, tôi hiểu những điều này là bình đẳng trong trường hợp này, tôi nghĩ vậy :)
địa lý vào

Nếu bạn có một tệp, FNR luôn là NR, nếu tệp1 có 10 dòng, dòng đầu tiên của tệp2 sẽ có NR = 11 và FNR = 1
Archemar

Xin chào Tôi muốn làm một cái gì đó tương tự nhưng chấp nhận mọi thứ trong phạm vi từ -4 đến 4. Làm thế nào tôi có thể làm điều này, vì đây là cách duy nhất tôi có thể nghĩ đến khi thực hiện nó hiện tại '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles

1
awk không biết về phạm vi phong cách toán học, xem chỉnh sửa của tôi.
Archemar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.