쉘 스크립트 - 값이 다음보다 작으면 여러 줄을 확인하십시오.

쉘 스크립트 - 값이 다음보다 작으면 여러 줄을 확인하십시오.

입력 파일(.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

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

관련 정보