1

Bashでは、2つの異なるCSVのフィールド(file1のフィールド2とfile2のフィールド3)を比較したいと思います。

diff <(cut -d, -f2 file1) <(cut -d, -f3 file2)

私はこれをより一般的にRubyで実装しようとしました:

def identical_files?(file1, field1, file2, field2)                                                                                                              
  %x{diff <(cut -d, -f#{field1} #{file1}) <(cut -d, -f#{field2} #{file2})}.blank?                                   
end

%x{}ブロックの出力を印刷すると、が表示されsh: Syntax error: "(" unexpectedます。Ruby内でシェルコマンドを実行すると、I / Oリダイレクトが機能しませんか?これは、bashでのみサポートされており、shではサポートされていないためですか?

4

3 に答える 3

4

あなたが得ているエラーが示すように、RubyはBashではなくshにシェルアウトするため、機能しません。もちろん、sh はその構文をサポートしていません。

代わりに Bash を明示的に呼び出すことができます:

`bash -c 'cat <(echo foo)'`  #=> "foo"
于 2013-02-08T04:33:24.267 に答える
0

cutCSV ファイル内のフィールドを処理するような単純なものを使用しようとしないでください。CSV ファイルには、フィールド内にカンマが埋め込まれている可能性があります。これはフール カットになり、コードが間違った動作をする原因になります。

代わりに、Ruby のCSVクラスなど、CSV ファイルを処理するために特別に設計されたものを使用してください。この未テストのコードのようなものから始めることができます:

「csv」が必要

csv_file1 = CSV.open('ファイル1')
csv_file2 = CSV.open('ファイル2')

(csv_file1.eof? || csv_file2.eof?) するまで
  行 1 = csv_file1.shift
  行 2 = csv_file2.shift

  # フィールドを比較するために何かをする
  puts "#{ csv_file1.lineno }: #{ 行 1[1] } == #{ 行 2[2] } --> #{ 行 1[1] == 行 2[2] }"
終わり

[
  [csv_file1, 'file1'],
  [csv_file2, 'ファイル2']
].each do |f, fn|
  f.eof?
  f.閉じる
終わり

于 2013-02-08T06:06:50.110 に答える
0

これは、sh ではなく bash でのみサポートされているためですか?

はい。

sh が実際には bash であっても (互換性のため)、プロセス置換は sh によってサポートされていません。

于 2013-02-08T04:33:10.053 に答える