다음과 같은 CSV 파일이 있습니다.
miami,20,in
lansing,2,cm
austin,3,mm
chicago,5,miles
phoenix,2,feet
첫 번째 필드는 이름이고, 다음 필드는 값이며, 세 번째 필드는 단위를 나타냅니다. 현재 데이터 세트에 있는 모든 단위를 나열하지만, 데이터 세트가 시간이 지남에 따라 변경되고 다른 측정 단위가 필요할 것으로 예상하기 때문에 이러한 단위로 제한되지는 않습니다.
모든 값이 공통 단위(인치)로 변환되어 이름과 함께 나열되도록 이 CSV 파일을 스크립트에서 처리할 수 있기를 원합니다. 따라서 다음과 같아야 합니다.
miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24
units
내 데이터에 미터법 단위와 영국식 단위가 혼합되어 있으므로 단위 변환을 위해 찾고 있던 것과 정확히 일치하는 단위 변환 도구가 있다는 것을 발견했습니다 .
예를 들어, 데이터의 마지막 행을 인치로 변환하려면 다음을 수행합니다.
units 2cm in -t
이것이 나에게 줄 것이다
0.78740157
현재 제가 찾고 있는 도움은 스크립트에서 이 명령을 사용하고 제가 설명한 형식(두 번째 코드 블록)으로 출력하는 방법입니다. CSV 데이터는 현재 $citydata
bash 스크립트에서 호출되는 변수에 저장되어 있습니다. 현재는 문자열입니다.
답변1
이것은 선형이다앗주문하다:
$ awk -F, '{system("printf " $1 ",;units " $2$NF " in -t ")}' file
miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24
system
이 명령은 명령 내에서 다른 쉘 명령을 호출합니다awk
. 따라서 먼저 SCV 파일의 첫 번째 필드가 인쇄되고"printf " $1 ",
그 뒤에 쉼표가 붙은 다음,
두 번째 및 마지막 필드를 input 으로 사용하여 명령이 호출됩니다units
.$2
$NF
노트system
명령어를 사용하고 싶을 awk
때당신은해야합니다이러한 명령과 해당 옵션은 awk
그 안의 옵션을 제외하고 큰따옴표로 묶습니다.
답변2
다음을 수행할 수 있습니다.
#!/usr/bin/env bash
## The data is in the $citydata array
citydata=( $(cat file) )
## For each element of the array
for i in "${citydata[@]}"
do
## Read the fields, splitting on commas
IFS="," read -r city val unit <<<"$i"
## Print out the city and the value converted to inches
echo "$city,$(units $val$unit in -t)"
done
예제의 데이터를 고려하면 위의 결과는 다음과 같습니다.
miami,20
lansing,0.78740157
노트
- 스크립트에서는 한 줄에 3개의 쉼표로 구분된 필드가 필요합니다.
- 중첩된 쉼표는 이를 깨뜨립니다(예: )
"Washington, DC",20,cm
. units
변환할 수 있는 모든 단위를 처리할 수 있습니다 .
답변3
units
기능을 사용하고 싶다면 쉽게 할 수 있습니다awk
awk -F, -v OFS=, '{"units "$(NF-1)$NF" in -t"|getline $(NF-1);NF=NF-1}1'