- 締切済み
sdiffの桁あわせについて
Linuxのsdiffコマンドについての質問です。 sdiffでfile1とfile2を比較した場合、普通はfile1とfile2の間に自動的にタブもしくはスペースが挿入されてfile2の開始位置が縦に揃うようになります。(下の例1参照) ところが日本語が混じった行に関しては縦にうまく揃ってくれず困っています。(下の例2参照) このような場合でもうまく縦に揃えて出力できる良い方法はないでしょうか? ご回答よろしくお願いします。 (等幅フォントで見てください。) 例1 aaa aaa bbb | xxx ddddd | yyyy ←file2が縦に揃って出力される ee ee 例2 aaa aaa bbb | xxx ああ | いい ←期待する位置よりも右にずれる ee ee
- みんなの回答 (3)
- 専門家の回答
みんなの回答
すみません、else と if の間はスペースです。 \tも不必要ですね。 sdiff file1.txt file2.txt |\ awk '{if($2=="<"){printf("%-50s%s\n",$1,$2)}\ else if (NF==2){printf("%-50s %s\n",$1,$2)}\ else{printf("%-50s| %s\n",$1,$3)}}' 多分、これをktermなどにペーストすればうまくいくのでは? awkで1列目を50バイトの幅で表示するようにしています。 sdiffが表示する一致しない行のマーク|はいまの場合も同じように表示させるようにしています。
たぶん、それは日本語が問題ではなくて、 あとから出て来る単語の長さが長いと起こるようですね。 それならばこれでどうだ! sdiff file1.txt file2.txt |\ awk '{if($2=="<"){printf("%-50s\t%s\n",$1,$2)}\ elseif (NF==2){printf("%-50s\t %s\n",$1,$2)}\ else{printf("%-50s\t| %s\n",$1,$3)}}' ファイルに含まれる単語が50バイト以下と仮定してます。 それより長い単語の場合は50を適当にふやしてください。 また逆に、もっと短いのなら50を減らせばもっとくっついて表示されます。
こんばんわ~ 等幅フォントでの見方がよくわからないので、問題を把握しきれてるかどうか自信ありませんが、 とりあえず、2バイト文字が入るとsdiffの出力がずれると思って回答します。 私の環境でやってみましたが、とくにズレるということはないようですよ。 ちなみに、バージョンは sdiff (GNU diffutils) 2.8.1 です。(sdiff --versionで出ます。) あるいは、下のようにフィルタして整形てみるとか。 sdiff file1 file2 | awk '{if(NF==2){print $1"\t "$2}else{print $1"\t"$2$3}}' ただし、file1,file2はともに、 aaa bbb ああ ee のように、単語が空白のない形で1行に1つづつ並んでいると仮定しています。
お礼
回答ありがとうございます。 2バイト文字が入るとsdiffの出力がずれるという問題ですが、4文字以上にならないと問題が起こらないようです。 awkはまだよく勉強していないので良くわかりませんが、回答して頂いたものをそのまま試してもうまくできませんでした。
補足
質問の例がわかりにくく、回答者の方にご迷惑おかけしました。少し補足します。 (1)gooの画面で入力したとき、半角スペースが複数続くと自動的に1つの半角スペースにされてしまうようで、質問の例の意図が伝わりにくくなってしまいました。 そこで半角スペースの変わりに_を使って例を書き直します。 (2)質問の例そのものが適切でありませんでした。全角文字が4文字以上あるとずれるようです。全角文字が多ければ多いほどずれる量も大きくなります。 例1 aaa__________aaa bbb_______|__xxx ddddd_____|__yyyy ee___________ee 例2 aaa__________aaa bbb_______|__xxx ああああ___________|__いいい ee___________ee 上の部分をメモ帳にコピーペーストすれば等幅で見られると思います。 使っているsdiffのバージョンは2.7です。