次の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 データは、現在$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 ",
その後にカンマが続き、次に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'