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.csv
2番目のフィールドにあり、その間にタブ文字があります。
ヘッダー行は削除され、最初のコードブロックは配列の3つのカウンタの1つをインクリメントしますcmp
。cmp[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
$.
NR
in Perlawk
は in とほぼ同じなので、$. > 1
入力のヘッダー行をスキップします。を使用した場合に-MEnglish
変更できます。$.
$NR