2017-05-15 8 views
1

私は、次のファイルがあります。

file1.csv
は期待通りに動作しない

Name,Age,Roll 
Anu,21,1 
Subi,18,2 
Blah,10,3

file2.csv

Fruit,Color,Roll 
Mango,Orange,1 
Mango,Blue,1 
Apple,Black,3

Iをこれが私の結果であるように2つのファイルに参加したい:

Name,Age,Roll,Fruit,Color 
Anu,21,1,Mango,Orange 
Anu,21,1,Mango,Blue 
Subi,18,2,, 
Blah,10,3,Apple,Black

私は、次のコマンドを実行しました:

,Fruit,Colorl 
,Mango,Orange 
,Mango,Blue 
,,bi,18,2 
Blah,10,3,Apple,Black

は、これは私が必要と出力されませんでした(実際、私もどのように理解していなかった。
join -t, -a1 -13 -23 -o 1.1,1.2,1.3,2.1,2.2 file1.csv file2.csv

は、これは私が得た出力ましたこの出力は)ようになりましたので、私はもう一度試してみました:
join -t, -a1 -13 -23 hi.csv hi2.csv

私が得た出力:

,Name,Age,Fruit,Color 
,Anu,21,Mango,Orange 
,Anu,21,Mango,Blue 
Subi,18,2 
3,Blah,10,Apple,Black

この時点で私は無知です。私は通常の.txtファイルでjoinを試してみて、彼らは完全に働いています。私はまた、stackoverflowに関する同様の質問のための様々な他のソリューションを参照していますが、どれもうまくいきませんでした。助けてください。

注:私はMacを使用しています。

+1

ファイルにキャリッジリターンが含まれていますか? 'dos2unix file'や' sed $ 's/\ r //' file'を実行すれば、最初のコマンドは期待通りに動作するはずです。 – 123

+0

@ 123完全に動作します。ありがとう! –

答えて

1

実際には、123が重要なヒントを与えたようです。行末\nfile1.csvfile2.csv

  • マックのスタイル::行末\rmacfile1.csvmacfile2.csv
  • は私が

    • Unixのスタイルであなたのサンプルファイルを用意し、これをチェックアウトするにはDOS/Windowsスタイル:行末\r\ndosfile1.csvdosfile2.csv)。

    (cygwinの上のbashで)私のテストセッション:

    $ join -t, -a1 -13 -23 file1.csv file2.csv 
    Roll,Name,Age,Fruit,Color 
    1,Anu,21,Mango,Orange 
    1,Anu,21,Mango,Blue 
    2,Subi,18 
    3,Blah,10,Apple,Black 
    
    $ hexdump -c file1.csv 
    0000000 N a m e , A g e , R o l l \n A n 
    0000010 u , 2 1 , 1 \n S u b i , 1 8 , 2 
    0000020 \n B l a h , 1 0 , 3 \n      
    000002b 
    
    $ cat file1.csv | tr "\n" "\r" >macfile1.csv 
    
    $ cat file2.csv | tr "\n" "\r" >macfile2.csv 
    
    $ hexdump -c macfile1.csv 
    0000000 N a m e , A g e , R o l l \r A n 
    0000010 u , 2 1 , 1 \r S u b i , 1 8 , 2 
    0000020 \r B l a h , 1 0 , 3 \r      
    000002b 
    
    $ cat file1.csv | sed $'s/$/\r/' >dosfile1.csv 
    
    $ cat file2.csv | sed $'s/$/\r/' >dosfile2.csv 
    
    $ hexdump -c dosfile1.csv 
    0000000 N a m e , A g e , R o l l \r \n A 
    0000010 n u , 2 1 , 1 \r \n S u b i , 1 8 
    0000020 , 2 \r \n B l a h , 1 0 , 3 \r \n  
    000002f 
    
    $ join -t, -a1 -13 -23 file1.csv file2.csv 
    Roll,Name,Age,Fruit,Color 
    1,Anu,21,Mango,Orange 
    1,Anu,21,Mango,Blue 
    2,Subi,18 
    3,Blah,10,Apple,Black 
    
    $ join -t, -a1 -13 -23 macfile1.csv macfile2.csv 
    Blah,10,3Age,21,1 
    
    $ join -t, -a1 -13 -23 dosfile1.csv dosfile2.csv 
    ,Name,Age,Fruit,Color 
    ,Anu,21,Mango,Orange 
    ,Anu,21,Mango,Blue 
    ,Subi,18 
    ,Blah,10,Apple,Black 
    
    $ 
    

    ...と推奨何123適用:

    $ cat dosfile1.csv | sed $'s/\r//' >dosfile1.fixed.csv 
    
    $ cat dosfile2.csv | sed $'s/\r//' >dosfile2.fixed.csv 
    
    $ join -t, -a1 -13 -23 dosfile1.fixed.csv dosfile2.fixed.csv 
    Roll,Name,Age,Fruit,Color 
    1,Anu,21,Mango,Orange 
    1,Anu,21,Mango,Blue 
    2,Subi,18 
    3,Blah,10,Apple,Black 
    
    $ 
    

    を...期待される出力を達成することができます。

    うまくいけば、Macでも同じように動作します。

  • +0

    123が推奨するコマンドで動作します。パーフェクト –

    関連する問題