2016-06-30 15 views
0

awkを使用して異なるタイプの値を持つ.csvファイルを編集したいとします。たとえば、いくつかの異なる列のすべての値を小数点第2位に丸めます。他の行にも浮動小数点値が含まれることがありますが、それらは異なる方法で処理されます。awkを使用してcsvファイルの複数の列を編集する方法

1行が下のようになっていて、7番目、8番目、9番目の列を編集したいとします(実際にはもっと長くなりますが、すべての関連する値の型はこの例です)スケールの):

L ,P_005 ,250.092 ,20.0 ,-0.80 ,0.803443 ,0.23342 ,0.83728329 ,0.0 ,0.0 

出力は、私が使用して1列の "x" の値の周りに常にきた今まで

L ,P_005 , 250.092, 20.0, -0.80, 0.80, 0.23, 0.84, 0.0, E2=0.0 

次のようになります。

#/bin/sh 
OLDIFS=$IFS 
IFS = "," 
file=$1 
... 
awk '{printf "%.2f",$x}' $1 
... 
IFS=$OLDIFS 

それでは、どのよう私は

  • 編集複数の列と
  • ディスプレイ全体のCSVファイル

できる特定のオプションで各列を書き留めずに、途中でこの概念を適応させますか?私はあなたのguestion権を得た場合

+3

あなたの質問には、簡潔でテスト可能なサンプル入力と予想される出力を含む[mcve]が含まれています。スクリプト、入力、および出力に '{}'エディタボタンを使います。あなたが現在使用しているスクリプトとして表示しているものは、有効なawk構文ではありません。私たちに1つのことを示して、それがあなたの質問を難読化し、私たちがあなたを助けることを難しくするようなものだと教えてください。 –

+0

アドバイスありがとうございます。私は自分の編集が要件に合うことを願っています – krouch

+0

サンプル入力/出力の1行を投稿すると、その1行の入力に対してのみ機能する解決法が得られる可能性が高くなります。あなたがあなたの質問にもっと力を入れればするほど(例えば、雨の日やあなたの入力に想定される辺のケースなど)、堅牢なソリューションを得る可能性が高くなります。 –

答えて

1

は:

awk -F\; -v OFS=\; ' 
function foo(str) { 
    if(match(str, /[0-9]+\.[0-9]+/, arr)) { 
    gsub(/[0-9]+\.[0-9]+/, sprintf("%.2f",arr[0]), str) 
    } 
    return str 
} 
{ 
    for(i=1; i<=NF; i++) 
    printf "%s%s", foo($i),(i<NF?OFS:ORS) 
}' test.in 

それは生産:

L;P_005;X 250; Y 20; Z 0; A 0.80; B 0.23; C 0.84; E1=0.00; E2=0.00 , 

を。

+0

'+'を正規表現で '{2、}'に変更すると、 'L; P_005; X 250; Y 20; Z 0; 0.803443; B 0.23342; C 0.83728329; E1 = 0.0; E2 = 0.0、 ' – karakfa

+0

これは、match()の3番目の引数のためにGNU awkでしか動作しないことを言及する必要があります。もっと重要なのは、これは、投稿されたサンプル入力では動作するが、他の潜在的な入力では失敗するスクリプトの良い例です。たとえば 'P_005'を' P_00.5'に変更してみると、 'P_0.50'として出力されます。 –

関連する問題