![쉘 스크립트에서 csv를 읽고 사용자 입력과 가장 가까운 일치 항목을 기준으로 열 헤더를 인쇄합니다.](https://linux55.com/image/164560/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20csv%EB%A5%BC%20%EC%9D%BD%EA%B3%A0%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%9E%85%EB%A0%A5%EA%B3%BC%20%EA%B0%80%EC%9E%A5%20%EA%B0%80%EA%B9%8C%EC%9A%B4%20%EC%9D%BC%EC%B9%98%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%EC%97%B4%20%ED%97%A4%EB%8D%94%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
CSV 파일이 있습니다. 여러 개의 열이 있습니다. 숫자 값을 입력하라는 메시지를 표시하고 csv에서 가장 가까운 일치 항목을 찾아 열 머리글을 인쇄하는 쉘 스크립트를 개발하고 싶습니다. 예를 들어
Apple orange grape berry
1 1.3 1.9 0.4 1.756
2 2.1. 3.3 6.6 0.964
3 0.444 1.364 1.1 3.6
사용자 입력이 3.4인 경우 가장 가까운 값은 3.3이고 출력은 "This is Orange"여야 합니다.
이를 달성하는 방법에 대한 아이디어. (참고 - CSV는 상당히 큰 파일입니다.)
답변1
이것은 약간 우아하지 않지만 작동합니다.
read -p "Enter a value .... " t
awk -v test=$t 'NR==1{min=1000;for (i=1; i<=NF; i++) head[i]=$i}
NR>1 && NF>0{for (i=2; i<=NF; i++){diff=($i<test)?(test-$i):($i-test); if (diff<min) {min=diff; item=i-1} }}
END{ print "Closest to "test" is "head[item]}' file
산출
Closest to 3.4 is orange