私は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
のみ。
表示されていない構文にエラーがありますか、またはこの構文を完全に間違って使用している可能性がありますか?
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt
出力:
sample1
sample2
説明:
^[1-9]$
-> $ 4は1〜9の1桁でなければなりません|
(パイプ)->または^10$
-> $ 4は10でなければなりませんawk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
Awkのみを使用してそれを行う方法があるかもしれません(決して気にしないで、下の私の編集を参照してください)が、私はそれを知りません。私はそれをgrepと組み合わせます:
egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'
4番目の列を、範囲ではなく文字列「1-10」と一致させていると思います。また、-F:
は、区切り文字をスペースではなくコロンに変更します。
編集:
awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt
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から始まるインデックスが付けられています
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