浮動小数点データを含む2つのcsvファイルを比較し、違い統計を印刷します。

浮動小数点データを含む2つのcsvファイルを比較し、違い統計を印刷します。

a.csvとb.csvという2つのcsvファイルがあります。どちらのファイルも同じ行セットを含みます。たとえば、

a.csv:

Yield
5.68
1.34
1.47
9.01
7.59

b.csv:

Yield
5.68
2.01
0.78
7.98
8.17

これら2つのファイルを比較し(ファイルの順序は常に同じです。つまり、a.csvのi行は常にb.csvのi行と一致します)、次の統計を印刷する必要があります。

a.csv is greater than b.csv in 2/5 cases.
a.csv is smaller than b.csv in 2/5 cases.
a.csv is equal to b.csv in 1/5 cases.

参照:これを行うためにRコードを書いたが、Unix自体でやりたい。たぶんawkを使用しますか?

a <- read.csv('path/a.csv')
b <- read.csv('path/b.csv')
sum(a > b)
sum(a < b)
sum(a == b)

ベストアンサー1

$ paste a.csv b.csv | awk -F '\t' 'NR > 1 { ++cmp[$1>$2 ? 1 : $1==$2 ? 0 : -1] } END { printf "greater\t= %d\nsmaller\t= %d\nequal\t= %d\n", cmp[1],cmp[-1],cmp[0] }'
greater = 2
smaller = 2
equal   = 1

awkこれにより、ショートプログラムへの2つの列入力が生成されますpaste。の内容はa.csv最初のフィールドにあり、の内容はb.csv2番目のフィールドにあり、その間にタブ文字があります。

ヘッダー行は削除され、最初のコードブロックは配列の3つのカウンタの1つをインクリメントしますcmpcmp[1]最初のフィールド(a.csv)が2番目のフィールド()より大きい場合、b.csv値は増加します。cmp[0]両方のフィールドが等しい場合、値は増加します。cmp[-1]2番目のフィールドが最初のフィールドより大きい場合、値は増加します。

最後に、END結果をブロックとして印刷します。

Perlでも、宇宙船演算子を使用して同じことが行われます<=>

$ paste a.csv b.csv | perl -a -F'\t' -e '$. > 1 && ++$cmp{$F[0] <=> $F[1]}; END { printf "greater\t= %d\nsmaller\t= %d\nequal\t= %d\n", $cmp{1},$cmp{-1},$cmp{0} }'
greater = 2
smaller = 2
equal   = 1

$.NRin Perlawkは in とほぼ同じなので、$. > 1入力のヘッダー行をスキップします。を使用した場合に-MEnglish変更できます。$.$NR

おすすめ記事