2016-03-31 1 views
0

私はこの奇妙な現象を私は理解していません。私はawkで何か重要なことを逃していると思う。私は、SIGNALを含む行があるときに、行全体を 'c'という文字列に累積的に連結したい。文字列は 'a'と 'b'の連結で始まり、うまく動作します。awk文字列連結が機能しない2(シェル設定エラー?)

ファイルin.dat

SIGNAL Hello1! 

ファイルtt.awk

BEGIN { a = "a"; b = "b"; c = a b; } 
/SIGNAL/ { c = c " " $0; } 
END  { print c; } 

私はawk -f tt.awk in.datを行うとき、私は(予想通り)を取得:

ab SIGNAL Hello1! 
私が見に期待

SIGNAL Hello2!1! 

ab SIGNAL Hello1! SIGNAL Hello2! 

は、私は私のCentOSのシェル上でそれをやっているその後、私は再びawk -f tt.awk in.datを行う

SIGNAL Hello1! 
SIGNAL Hello2! 

とget:0

今私はにin.datを変更します(私の~/.cshrcファイルの設定を束ねて)。私はCygwinシェルでこれらをチェックして、期待通りに正常に動作します。私のCentOSシェル設定に何か問題があります。どうなり得るか?

+0

あなたのコードで期待通りの結果( 'ab SIGNAL Hello1!SIGNAL Hello2!')が得られました。あなたのシェル設定は何ですか? – isedev

+3

'in.dat'はDOSの行末を持っていますか? –

+0

'cat -vet file'のDOS行末のchkです。行末に '^ M $'がある場合は 'dos2unix file'を使います。皆さんお元気で。 – shellter

答えて

1

これは、DOSの行末に問題があります(上記のコメントのEtan Reisnerに記載されています)。 in.datの2番目のバージョンでは、改行には\r\nが使用され、awkには対応できません。これは本当に何をしているか疑問に思う

$ echo "SIGNAL Hello1\!\nSIGNAL Hello2\!" |awk -f tt.awk 
ab SIGNAL Hello1! SIGNAL Hello2! 
$ echo "SIGNAL Hello1\!\r\nSIGNAL Hello2\!" |awk -f tt.awk 
SIGNAL Hello2!1! 

:あなたと同じtt.awkコードを使用して

? UNIXの場合、\rは一番左の位置に行の位置をリセットしますが、ではなくが行を送ります(これは\nです)。 DOSは暗黙的に\rを取りますが、\nは一行下がり、一番左の位置には戻らないと解釈します。

はここで何が起こっているのか説明するためにいくつかの実験である:

$ echo "SIGNAL Hello1\!\r\nSIGNAL Hello2\!" 
SIGNAL Hello1! 
SIGNAL Hello2! 
$ echo "SIGNAL Hello1\!\rSIGNAL Hello2\!" 
SIGNAL Hello2! 
$ echo "ab SIGNAL Hello1\!\n SIGNAL Hello2\!" 
ab SIGNAL Hello1! 
SIGNAL Hello2! 
$ echo "ab SIGNAL Hello1\!\r SIGNAL Hello2\!" 
SIGNAL Hello2!1! 

は最後の二つの項目に特に注意してください。 awkはあなたのため\nストリップが、\rを保持するので、その後\r最初のラインab SIGNAL Hello1!としてプリントとが適用され、2行目signal Hello2!は最初の行の上書き込まれます。最初の行の最後の2文字(1!)は、2行目がそれらを上書きするのに十分な長さではなかったため残っています。

今、私たちはこの問題を知っていることを、私たちは、コードを修正することができます

BEGIN { a = "a"; b = "b"; c = a b; } 
/SIGNAL/ { gsub(/\r/, ""); c = c " " $0; } 
END  { print c; } 

これはcに追加された行からすべて\r秒を削除します。

+0

ありがとう!私は窓から持ってきた大きなファイルから始めました。限り、Windowsからのファイルは、それは私がそれを編集するに関係なくDOS形式で留まるようです。ちょうど今、私はLinuxでテストを始めました。それはうまくいきました(私はLinuxで作られたin.datでテストしたと思っていましたが、おそらく私の間違いでした)。 –

関連する問題