web-dev-qa-db-ja.com

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

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'

私は考えます?

18
geokrowding

もうすぐだ。

 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 ) )同じ、ヘッダーを含む
20
Archemar