CSV単位変換

CSV単位変換

次のCSVファイルがあります。

miami,20,in
lansing,2,cm
austin,3,mm
chicago,5,miles
phoenix,2,feet

最初のフィールドは名前、次のフィールドは値、3番目のフィールドは単位を表します。現在データセット内のすべての単位を一覧表示しますが、データセットが時間の経過とともに変化し、他の測定単位が必要になると予想するため、これらの単位に限定されません。

すべての値が共通の単位(インチ)に変換され、名前で一覧表示されるように、このCSVファイルをスクリプトで処理できるようにしたいです。したがって、次のようにする必要があります。

miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24

units私のデータにはメートル法単位と英国単位が混在しているので、単位変換のために探していたものと正確に一致する単位変換ツールがあることがわかりました。

たとえば、データの最後の行をインチに変換するには、次のようにします。

units 2cm in -t

これが私に与えるでしょう

0.78740157

現在私が探している助けは、スクリプトでこのコマンドを使用し、私が説明した形式(2番目のコードブロック)で出力する方法です。 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 ",その後にカンマが続き、次に2,番目と最後のフィールドが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

ノート

  • スクリプトでは、1行に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'

関連情報