AWKを使用して、列の値(列番号と値がコマンドラインから渡される場合)に基づいてファイルをフィルタリングします。

AWKを使用して、列の値(列番号と値がコマンドラインから渡される場合)に基づいてファイルをフィルタリングします。

タブ区切りのファイルがあります。ユーザーが列番号と番号を指定できるように、AWKを使用してファイルをフィルタリングしたいと思います。これにより、スクリプトは、指定された列の値がその番号より大きいファイル(およびヘッダー)の行のみを返します。 。たとえば、列3としきい値0.28が必要な場合は、次のファイルを使用したいと思います。

Col1 Col2 Col3 Col4 Col5
...  ...  0.12 ...  ...
...  ...  0.323 ...  ...
...  ...  0.4123 ...  ...
...  ...  0.002 ...  ...
...  ...  0.896 ...  ...

そして得る

Col1 Col2 Col3 Col4 Col5
...  ...  0.323 ...  ...
...  ...  0.4123 ...  ...
...  ...  0.896 ...  ...

私は次のスクリプトを試しました

#!/bin/bash

#For testing

echo $1

echo $2

echo $3

awk -v col="$1" -v val="$2" '$col > $val' filename

を実行しようとすると、bash script.sh 3 0.28 filenameファイルの行は印刷されません。 echoコマンドのため、3、0.28、ファイル名のみが出力されます。

ただし、表示されるようにスクリプトを変更すると、

awk -v col="$1" -v val="$2" '$col > 0.28' filename

予想されるフィルタリング動作を取得します。$val数字として解釈されないかもしれないという考えに試してみました。

awk -v col="$1" -v val="$2" '$col > ($val + 0)' filename

これにより、ファイルのすべての行が印刷され、TRUEと評価されると考えられます。私はAWKに初めて触れたので、ここからどこから始めるべきかわかりません。

関連情報