Eu tenho dois arquivos e um script de shell.
Arquivo 1:
Batman
Superman
John Snow
Jack Sparrow
Rob Stark
Arquivo 2:
Batman
Ironman
Superman
Spiderman
John Snow
Arya Stark
Jack Sparrow
Rob Stark
The hound
Roteiro:
#!/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
O script funciona perfeitamente bem, a saída é:
> Arya Stark
Batman Batman
> Ironman
Jack Sparrow Jack Sparrow
John Snow John Snow
Rob Stark Rob Stark
> Spiderman
Superman Superman
> The hound
Mas quero que a saída seja automaticamente:
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
Qual é a melhor maneira de fazer isso usando apenas o comando diff?
Responder1
Existem várias melhorias que você pode fazer em sua abordagem, mas, mantendo tudo igual, tudo que você precisa é adicionar mais uma linha ao seu script e então fazer a última linha anexar ( >>
) em vez de sobrescrever:
#!/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
Uma maneira melhor de escrever isso seria
#!/usr/bin/env bash
file1="$1"
file2="$2"
printf "%-36s%36s\n" "FileA" "FileB"
diff -y <(sort "$file1") <(sort "$file2")
E então execute com:
script.sh file1.txt file2.txt > diff.txt
Isso evita a criação de arquivos temporários desnecessários e não exige que os nomes dos arquivos sejam codificados no script.
Alternativamente, se você quiser que os nomes reais dos arquivos sejam mostrados, altere a printf
chamada acima para
printf "%-36s%36s\n" "$file1" "$file2"