awk + ​​if文を使用して、2つの列のすべての行の組み合わせを比較します。

awk + ​​if文を使用して、2つの列のすべての行の組み合わせを比較します。

11個のデータ列を持つファイルがあり、各列はスペースで区切られています。列2の各行について、列9に最も近い値を見つける必要があります。したがって、次は列2(0.01)の最初の項目を取得し、列9(行3の0.009)に最も近い値を探します。

ファイルレイアウト:

x 0.01 x x x x x x 0.002 x x
x 0.034 x x x x x x 0.0045 x x
x 0.002 x x x x x x 0.009 z z
x 0.002 x x x x x x 0.0021 x x
x 0.015 x x x x x x 0.0031 x x

現在のコード:

awk '{
if (sqrt(($2)^2-($9)^2)<0.0001)
   print "Particle ID  "$1" is within 2D of wall"
}' filename

私はここに2つの問題があると思います。

1)これはすべての置換を比較するのではなく、列のすべての行を比較します。

2)最も近い範囲ではなく、特定の範囲内にあるが確認します。

必要な出力は、次のような新しいファイルになります。

x 0.01 x x x x x x 0.009 z z

他のすべての行にも同様です。

ベストアンサー1

awkマクロの使用TXR不明瞭な音声:

$ txr closest.tl < data
x 0.01 x x x x x x 0.009 x x
x 0.034 x x x x x x 0.009 x x
x 0.002 x x x x x x 0.0021 z z
x 0.002 x x x x x x 0.0021 x x
x 0.015 x x x x x x 0.009 x x

コードは次の場所にありますclosest.tl

(build
  (awk
    ((fconv - r : : r - -) (add f))
    (:end (let ((fs (get)))
            (each ((f fs))
              (let ((min (find-min fs : (op abs (- [f 1] [@1 8])))))
                (set [f 8] [min 8])
                (prn . f)))))))

  • build暗黙的なリストをプログラムで構成するための環境を作成します。埋め込みコードは、暗黙的なリストにアイテムを追加し、そのリストを取得するためにbuild使用します。(add ...)(get)

  • 環境内にはbuildマクロインスタンスがありますawk。このマクロには条件付きアクションルールと:endルールがあります。条件 - 作業ルールには(fconv ...)条件として式があります。これは無条件の事実なので、すべての記録を一致させます。fconv選択したフィールドを浮動小数点(= "real")に変換しますr。この操作の意味は、(add f)現在のフィールドのリストを暗黙のリストに追加することです。したがって、データはフィールドリストである行リストとして作成されます。

    fconvTXR Lispは強力な形式の言語なので、これが必要です。このawkマクロはAwkの多くの意味を実装していますが、"3.14"文字列を数値として扱うことができるダックタイピングは実装していません。

  • :endこの句はデータの終わりに実行され、awkここで最も近い処理が実行されます。行をという変数に入れ、fs各行に対して1つの変数を繰り返します。f各行に対して最小項を探します。fsここで、項は、検査された各行におけるその行のフィールド1とフィールド8の差の絶対値です。最小距離行が見つかったら、その行のフィールド 8 を対応する最小距離行のフィールド 8 に置き換えます。

    フィールド番号は0から始まります。[f 0]、、[f 1]... Awkとは異なり、0フィールドがレコード全体と呼ばれる慣例はありませんrec

  • フィールドを[f 8]最小距離フィールドに置き換えた後、フィールドを印刷します。

おすすめ記事