CSV 단위 변환

CSV 단위 변환

다음과 같은 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 데이터는 현재 $citydatabash 스크립트에서 호출되는 변수에 저장되어 있습니다. 현재는 문자열입니다.

​​​

답변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'

관련 정보