2016-12-20 10 views
0

AWKプログラムはMac OSXとLinuxディストリビューションでは異なると認識していますが、自家製のgawkでも同じ結果が得られません。配列キーとその値を同じ行に出力するために、私のMac上でAWKスクリプトを動作させるために何を調整する必要があるのか​​を理解したいと思っています。ここでAWK Mac OSXアレイキーと配列値を同じ行に表示する方法

は私のawkのファイルがあります:

BEGIN { FS="," } 
NR > 1 { 
    dupes[$3]++; 
} 

END { 
    OFS=" "; 
    for (key in dupes) { 
     if (dupes[key] > 1) { 
      print key, "occured", dupes[key], "times"; 

     } 
    } 
} 

そして、ここではのtest.CSVファイル

test,something,target_column3 
aaa,123,hi 
sss,222,hello 
ddd,333,hey 
fff,444,hi 
ggg,555,hi 
jjj,888,goodbye 
uuu,666,byebye 
lll,777,hey 

である私は、それはGNU Awkの4.0.1とUbuntuで同じように出力を表示します:

hey occured 2 times 
hi occured 3 times 

しかし、私のMac上でそれがgawkバージョンGNU Awkの4.1.4、APIで出力:1.1(GNU MPFR 3.1.5、GNU MP 6.1.2):とき別の変数、dupes[key]と一緒にそれはループのための私のkeyを印刷していない何らかの理由

occured 2 times 
occured 3 times 

。しかし、ライン上の唯一のものであればprint keyになります。

UPDATE:@ jasのコメントごとに、私は行末をチェックし、何らかの理由で私のCSVファイルにはCRLFが含まれていました。また、以下のようなプリント値を追加すると、奇妙な出力が現れます。私の代わりに私が得る、すべての長さが1以下の文字の長であることを期待する:

... 
    NR > 1 { 
     print length($3); 
     dupes[$3]++; 
    } 
... 


3 
6 
4 
3 
3 
8 
7 
4 
occured 2 times 
occured 3 times 

マックOSX AWK(またはGAWK)が配列のキーと同じ行に配列値の両方を印刷することはできませんなぜ任意の理由?

+1

これを再現できません。おそらくあなたの端末で何かをオフにする?出力をファイルにリダイレクトし、テキストエディタで表示してみてください。 – pvg

+1

「再生できません」とは、/ usr/bin/awkとgawk 4.1.4(macports)で期待通りに動作することを意味します。 – pvg

+2

ファイルに間違った行末があると、このようなことが起こる可能性があります。 $ 3の終わりに止まっている制御文字のように、カーソルを行頭に移動してから文字を書き続けます。 – jas

答えて

3

あなたのファイルはDOSスタイルのCRLF行末を持ち、MacのawkはLFを行末として認識しますので、最後のフィールドの最後にCRが追加文字として追加されます(この場合$ 3) 。

$ 3を印刷するとき、CRは行の先頭に移動して出力を続行する制御文字として機能し、印刷されなかったかのように表示されていたものを上書きします。

したがって、ソリューションでは確認したとおり、ファイルにdos2unixユーティリティを実行するだけで、環境に適合します。

+0

助けてくれてありがとう! – mfink

+0

これはFARで最も一般的な問題の原因になっています。問題を抱えている人にこれを最初に確認する方法がいくつかありました。 –

関連する問題