アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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が表示する一致しない行のマーク|はいまの場合も同じように表示させるようにしています。
    • good
    • 1

たぶん、それは日本語が問題ではなくて、


あとから出て来る単語の長さが長いと起こるようですね。

それならばこれでどうだ!

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を減らせばもっとくっついて表示されます。
    • good
    • 0

こんばんわ~


等幅フォントでの見方がよくわからないので、問題を把握しきれてるかどうか自信ありませんが、
とりあえず、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つづつ並んでいると仮定しています。

この回答への補足

質問の例がわかりにくく、回答者の方にご迷惑おかけしました。少し補足します。
(1)gooの画面で入力したとき、半角スペースが複数続くと自動的に1つの半角スペースにされてしまうようで、質問の例の意図が伝わりにくくなってしまいました。
そこで半角スペースの変わりに_を使って例を書き直します。
(2)質問の例そのものが適切でありませんでした。全角文字が4文字以上あるとずれるようです。全角文字が多ければ多いほどずれる量も大きくなります。

例1
aaa__________aaa
bbb_______|__xxx
ddddd_____|__yyyy
ee___________ee

例2
aaa__________aaa
bbb_______|__xxx
ああああ___________|__いいい
ee___________ee

上の部分をメモ帳にコピーペーストすれば等幅で見られると思います。
使っているsdiffのバージョンは2.7です。

補足日時:2004/11/01 15:18
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

2バイト文字が入るとsdiffの出力がずれるという問題ですが、4文字以上にならないと問題が起こらないようです。
awkはまだよく勉強していないので良くわかりませんが、回答して頂いたものをそのまま試してもうまくできませんでした。

お礼日時:2004/11/01 16:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!