フィールドの値が3以下の行を削除します-sedまたはawk?


17

8番目のフィールド(列)の値が2以下のすべての行を削除する必要があります。

私のデータは次のようになります。

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

awkを使用すると、必要な値を取り除いて別のファイルに出力できること、そしてsedが現在のファイルを編集することを理解しています。どちらの場合でも、元のファイルを保持する必要があります。

:ソリューションについて詳細な説明を提供してください。コマンドを記述するだけでは不十分です。提案に注釈を付けてください。

さらに注意:データにはヘッダー行があるため、ほとんどの場合、ソリューションには次のことが必要です。

awk 'FNR> 1'

私は考えます?

回答:


19

ほぼ手に入れました。

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

どこ

  • NR レコードの数(つまり、行の数)
  • $8 8フィールドです
  • && 論理的であり、
  • foo 変更されていない元のファイル
  • bar 結果のファイル
  • 暗黙のデフォルトアクションは、現在の入力行を出力することです

ヘッダーは、それを維持するためにfooからbarにストライプされることに注意してください

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

どこ

  • || 論理的または
  • NR == 1の場合、または$ 8> 2の場合、入力行が出力されます

アップデート#1

範囲を指定するには

  • ( ($8 >= -4) && ( $8 <= 4 ) ) -4から4までの8番目のフィールド
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) 同じ、ヘッダーを含む

素晴らしい答え:シンプルでありながら徹底的な、ありがとう。この場合のFNRとNRの違いは何もありません、正しいですか?現在のレコードのNR序数と現在のファイルの現在のレコードのFNR序数を説明するマニュアルページを読みました。この場合、これらが等しいことを理解しています。:)
geokrowding

ファイルが1つで、FNRが常にNRであり、file1に10行がある場合、file2の最初の行にはNR = 11およびFNR = 1
Archemar

こんにちは、似たようなことをしたいのですが、-4から4の範囲のすべてを受け入れます。これを行うにはどうすればよいでしょうか。これは、現在awk '(NR == 1)|| ($ 8 = [-4-4]) 'foo> bar-
ジャイルズ

1
awkは数学スタイルの範囲を知りません。私の編集を参照してください。
アルケマール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.