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