У меня есть два файла и скрипт оболочки.
Файл 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
Вы можете внести различные улучшения в свой подход, но, оставляя все по-прежнему, все, что вам нужно, это добавить еще одну строку в свой скрипт, а затем сделать так, чтобы последняя строка добавлялась ( >>
), а не перезаписывалась:
#!/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"