web-dev-qa-db-ja.com

AWKを使用して数値範囲の列を除外する

私はBASHが比較的新しいので、awkを使用して、テキストファイルの4番目の列に基づいて列1のデータをフィルター処理しようとしています。データの4番目の列がxの範囲と一致する場合、列1のデータが出力されます。 「x」は、1〜10の範囲の数値(1,2,3..10)であると想定されています。

awk -F: '{ if($4=="x") print $1}' filename.txt

filename.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20

実際の使用:

awk -F: '{ if($4=="1-10") print $1}' sample.txt
output = sample1, sample2, sample3, sample4

そのはず: sample1 sample2のみ。

表示されていない構文にエラーがありますか、またはこの構文を完全に間違って使用している可能性がありますか?

31
BurN135
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
64
Kambus
awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt

出力:

sample1
sample2

説明:

  • ^[1-9]$-> $ 4は1〜9の1桁でなければなりません
  • |(パイプ)->または
  • ^10$-> $ 4は10でなければなりません
14
olibre
awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
4
Gregory Patmore

Awkのみを使用してそれを行う方法があるかもしれません(決して気にしないで、下の私の編集を参照してください)が、私はそれを知りません。私はそれをgrepと組み合わせます:

egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'

4番目の列を、範囲ではなく文字列「1-10」と一致させていると思います。また、-F:は、区切り文字をスペースではなくコロンに変更します。

編集:

awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt
2
gpojd

Perlがオプションの場合、Kambusのawkソリューションに似たこのソリューションを試すことができます。

Perl -lane 'print $F[0] if $F[3] >= 1 && $F[3] <= 10' sample.txt

これらのコマンドラインオプションが使用されます。

  • -n入力ファイルのすべての行をループし、すべての行を自動的に印刷しません

  • -lは、処理前に改行を削除し、後でそれらを追加します

  • -a自動分割モード–入力行を@F配列に分割します。

  • -e Perlコードを実行します

@Fは各行の単語の配列で、0から始まるインデックスが付けられています

1
Chris Koknat

awkが範囲から値を検索するようにしたい場合は、BEGINステートメントでその範囲を設定できます。

awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 

テスト:

[jaypal:~/Temp] cat sample.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20
[jaypal:~/Temp] awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 
sample1
sample2
1
jaypal singh