shell 脚本 - 检查多行如果值小于

shell 脚本 - 检查多行如果值小于

我有输入文件(.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

这会逐行读取文件,从变量中${i//\"/}删除(如果有),然后通过管道传输到"echo number < minvalue公元前,返回 true 或 false。当结果为 true 时,循环中断,状态变量从 CONFIRMED 更改为 UNCONFIRMED。

你需要公元前为了这。

答案3

使用csvsql基于Python的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

相关内容