シェルスクリプト - 値が以下より小さい場合は、複数行を確認してください。

シェルスクリプト - 値が以下より小さい場合は、複数行を確認してください。

入力ファイル(.txtまたは.csv)があり、このファイルには異なる値があります(時々値はありません -> "")。これらの値のいずれかが0.001より小さい場合(または空 -> "")、出力は "UNCONFIRMED"でなければなりません。入力ファイルの各行に0.001より大きい(または等しいかどうかは重要ではありません)値が含まれている場合、出力は「確認済み」でなければなりません。

1.csvと入力してください。

"1.23"
"0.01"

2.csvと入力してください。

"1.23"
"0.01"
"0.00001"
""
""
"0.75"

出力-1.csv

"CONFIRMED"

出力2.csv

"UNCONFIRMED"

答え1

GNUの使用awk:

gawk -F '"' '
  BEGINFILE {found = 0}
  $2 < 0.001 {found = 1; nextfile}
  ENDFILE {
    output_file = FILENAME
    sub("input", "output", output_file)
    print FS (found ? "UN" : "") "CONFIRMED" FS > output_file
  }' ./input*.csv

答え2

シンプルで読みやすいフォーマット

file=input-1.csv
status="CONFIRMED"
minvalue=0.001

for i in $(cat $file)
do
    if [ $(echo "${i//\"/} < $minvalue" | bc) -eq 1 ]
    then
        status="UNCONFIRMED"
        break
    fi
done
echo $status

これは、ファイルを1行ずつ読み込み、変数${i//\"/}(存在する場合)から削除し、次にパイプします。"echo number < minvalue紀元前、true、またはfalseを返します。結果が true の場合、ループは中断され、状態変数は CONFIRMED から UNCONFIRMED に変更されます。

あなたはする必要があります紀元前このために。

答え3

csvsqlPythonベースの使用csvkit

$ csvsql --no-header-row --snifflimit 0 --query '
    SELECT CASE (SELECT COUNT(*) FROM "STDIN" WHERE a < 0.001) 
      WHEN 0 THEN "CONFIRMED" ELSE "UNCONFIRMED" 
    END AS "Status"
' < input-1.csv 
Status
CONFIRMED

$ csvsql --no-header-row --snifflimit 0 --query '
    SELECT CASE (SELECT COUNT(*) FROM "STDIN" WHERE a < 0.001) 
      WHEN 0 THEN "CONFIRMED" ELSE "UNCONFIRMED" 
    END AS "Status"
' < input-2.csv
Status
UNCONFIRMED

出力を引用符付き文字列にするには、結果をパイプします。csvformat -U1

関連情報