diff -y列名を割り当てる

diff -y列名を割り当てる

2 つのファイルとシェル スクリプトがあります。

ファイル1:

Batman
Superman
John Snow
Jack Sparrow
Rob Stark

ファイル2:

Batman
Ironman
Superman
Spiderman
John Snow
Arya Stark
Jack Sparrow
Rob Stark
The hound

脚本:

#!/bin/bash

sort ~/Desktop/file1.txt > ~/Desktop/fileA.txt
sort ~/Desktop/file2.txt > ~/Desktop/fileB.txt
diff -y ~/Desktop/fileA.txt ~/Desktop/fileB.txt > ~/Desktop/diff.txt

スクリプトは正常に実行され、出力は次のようになります。

                                  > Arya Stark
Batman                              Batman
                                  > Ironman
Jack Sparrow                        Jack Sparrow
John Snow                           John Snow
Rob Stark                           Rob Stark
                                  > Spiderman
Superman                            Superman
                                  > The hound

しかし、自動的に出力したいのは:

File A                               File B
                                  > Arya Stark
Batman                              Batman
                                  > Ironman
Jack Sparrow                        Jack Sparrow
John Snow                           John Snow
Rob Stark                           Rob Stark
                                  > Spiderman
Superman                            Superman
                                  > The hound

diff コマンドのみを使用してこれを行う最良の方法は何ですか?

答え1

アプローチにはさまざまな改善点がありますが、すべてを同じにしておくと、スクリプトにもう 1 行追加し、最後の行を>>上書きではなく追加 ( ) するだけです。

#!/bin/bash

echo -e "FileA\t\t\t\t\t\t\t\tFileB" > diff.txt
sort ~/Desktop/file1.txt > ~/Desktop/fileA.txt
sort ~/Desktop/file2.txt > ~/Desktop/fileB.txt
diff -y ~/Desktop/fileA.txt ~/Desktop/fileB.txt >> ~/Desktop/diff.txt

これをもっとうまく書くと

#!/usr/bin/env bash

file1="$1"
file2="$2"

printf "%-36s%36s\n" "FileA" "FileB"
diff -y <(sort "$file1") <(sort "$file2")

そして、次のように実行します:

script.sh file1.txt file2.txt > diff.txt

これにより、不要な一時ファイルの作成が回避され、ファイル名をスクリプトにハードコードする必要がなくなります。

あるいは、実際のファイル名を表示したい場合は、printf上記の呼び出しを次のように変更します。

printf "%-36s%36s\n" "$file1" "$file2"

関連情報