特定の列の任意の行でしきい値より高い値を持つファイルを移動します。

特定の列の任意の行でしきい値より高い値を持つファイルを移動します。

特定のフォルダに多数のファイルがあります。列4の行に0.5より大きい値が1つ以上ある場合は、このファイルをサブフォルダに移動したいと思います。別のコマンドで同じことをしたいのですが、ファイルの0.5列4に上記の値を持つ2行以上の行が必要です。

以下はファイルの一般的な形式です(ヘッダーを含む)。

col1  col2  col3  col4  col5  col6
ABC   DEF   5.10  0.94  GHI   JKL
MNO   PQR   8.31  0.37  STU   VWX
ABC   DEF   6.49  0.84  GHI   JKL
MNO   PQR   3.32  0.21  STU   VWX

4列のいくつかの数字は科学的表記法を使用します:8.934553871039306e-05

以下のコードは、これまでの列4に0.5以上の値が1つ以上あるファイルを移動しようとしています。最終的に、条件に一致しないファイルであっても、すべてのファイルがサブフォルダに移動さ​​れます。

#!/bin/bash

find . -type f -exec awk '$4 >= 0.5' {} \; -exec mv -n {} ./NewFolder/ \;

ベストアンサー1

コマンドが正しく機能するには、一致するものがある場合はコード0で終了し、awk一致するものがない場合は0以外の終了コードで終了する必要があります。

それ以外に、数値以外の値は文字列で比較され、予期しない一致が発生する可能性があるため、最初の行をスキップする必要があります。

find . -type f -exec awk 'FNR==1 {next} $4 >= 0.5 {found=1; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

注:awkスクリプトが複数のファイルで呼び出される場合、終了コードはすべてのファイルで一致するものが見つかったことを意味します。このfindコマンドは一度に1つのファイルのみを渡すので、ここではawk問題になりません。

2番目の編集:

一致する行が複数あるファイルを選択するには、一致を計算するだけです。

find . -type f -exec awk 'FNR==1 {next} $4 >= 0.5 {found++; if(found >= 2) exit} END {exit found >= 2}' {} \; -exec mv -n {} ./NewFolder/ \;

編集する:

列4に一致する値を持たないファイルを移動するスクリプト関連の問題をデバッグするには、スクリプトにコードを追加してawk一致する行に関する情報を印刷できます。次のコードは、一致するものが存在する場合、ファイル名、行番号、一致する行を印刷します。

find . -type f -exec awk 'FNR==1 {next} $4 >= 0.5 {found=1; printf "%s:%d:%s\n", FILENAME, FNR, $0; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

あなたは次のようなものを得るでしょう

threshold.txt:2:ABC   DEF   5.10  0.94  GHI   JKL

問題の原因を見つけるには、まずこれを行うことをお勧めします。

列4に数値以外のテキストを含む行がある場合、その値はテキストと比較されます。"abc"たとえば"0.5"

別の考えられる原因は、行の列1または2にスペースが含まれているため、テキストが列に誤って割り当てられている可能性があります。

列4に数値以外の値があり、その行を無視するには、値を追加して0数値解釈を強制できます0 + $4

find . -type f -exec awk 'FNR==1 {next} 0 + $4 >= 0.5 {found=1; printf "%s:%d:%s\n", FILENAME, FNR, $0; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

フィールドをタブで区切って値にスペースを含めることができるのが問題の原因である場合は、フィールド区切り記号(-F "\t")を指定できます。次のスクリプトはこれを他の修正と組み合わせます。

find . -type f -exec awk -F "\t" 'FNR==1 {next} 0 + $4 >= 0.5 {found=1; printf "%s:%d:%s\n", FILENAME, FNR, $0; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

おすすめ記事