ABC,1234.5333,5733.9374,5673.352,352,2.346374,-0.6686874
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
上記のcsvファイルで、最後の2つのフィールド[ABS(6番目のフィールド)またはABS(7番目のフィールド)]のいずれかの絶対値が> = 10のすべてのレコードを選択するシェルスクリプトを作成する必要があります。
その結果、私の出力は次のようになります。
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
答え1
示唆したように、awkを使用してこれを達成できます。絶対値を取得するには、独自の関数を定義する必要があります。したがって、次のように使用できます。
awk -F, 'function abs(a) {return a < 0 ? -a : a};(abs($6) >= 10 || abs($7) >= 10)' inputfile.txt
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
答え2
次の方法でawk
操作を実行できます(組み込み関数のみを使用)。
awk -F\, '{if (sqrt($(NF-1)*$(NF-1))>=10 || sqrt($NF*$NF)>=10 ) { print $0}}' input_file
答え3
csv
module や from をpython
使用するなど、データおよびフィルタ行を解析できるツールを使用します。csv
csvsql
csvkit
csvsql -H --query 'select * from file where abs(f) > 10 or abs(g) > 10' file | sed 1d
sed
(出力ヘッダー行を削除するためにパイプしました)。
出力:
XYZ,5463.674,93773.683,5734.874,432.0,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564.0,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764.0,-10.67484,5.74764
答え4
Miller(mlr
)とそのfilter
サブコマンドを使用して、サイズが10以上の2番目のフィールドまたは最後のフィールドを含むヘッダーなしのCSVファイルからすべてのレコードをフィルタリング(抽出)します。
$ mlr --csv -N filter 'abs($[NF-1]) >= 10 || abs($[NF]) >= 10' file
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
示されているように、awk
現在のNF
レコードのフィールド数。を使用すると、$[NF]
最後のフィールドの値を取得でき、whileは最後の$[NF-1]
2番目のフィールドの値を取得できます。
データにヘッダーがある場合は、その-N
オプションを削除して代わりにフィールド名を使用できます$[NF]
。
mlr --csv filter 'abs($fieldA) >= 10 || abs($fieldB) >= 10' file