Как различить только первую строку из двух файлов?

17

Я хочу различать только первую строку из двух файлов, в отличие от всего файла. Как бы я это сделал? Мне нужно решение только для первой строки, но если бы вы могли указать количество строк, это было бы гораздо лучшим ответом.

Таким образом, diff не возвращает различий между следующими двумя файлами:

a
1
2

и:

a
3
4
gsingh2011
источник
это сработало для вас ...?
nerdwaller
@nerdwaller Да, принято.
gsingh2011
холодные бобы. Пытался придумать другие варианты, к счастью, в этом нет необходимости.
nerdwaller

Ответы:

26

Ну вот:

diff <(head -n 1 file1) <(head -n 1 file2)

(это ничего бы не вернуло как никогда).

diff <(head -n 2 file1) <(head -n 2 file2)

Returns:
2c2
< 1
---
> 3

Вы можете включить это в сценарий, чтобы делать вещи, которые вы упоминаете.

#!/bin/bash

fileOne=${1}
fileTwo=${2}
numLines=${3:-"1"}

diff <(head -n ${numLines} ${fileOne}) <(head -n ${numLines} ${fileTwo})

Чтобы использовать это, просто сделайте сценарий исполняемым с помощью chmod +x nameofscript.shи затем выполняйте. ./nameofscript.sh ~/file1 ~/Docs/file2Это оставляет число строк по умолчанию равным 1, если вы хотите больше, добавьте число в конец этой команды.

(Или вы могли бы сделать переключатели в вашем скрипте с -f1 file1 -f2 file2 -n 1, но я не припомню, чтобы в верхней части моей головы было указано выражение case).

headвозвращает с начала количество строк в соответствии с предложением -n. Если бы вы хотели сделать обратное, это было бы tail -n ${numLines}(хвост делает с конца назад количество строк).

Изменить 5/10/16:

Это характерно для Bash (и совместимых оболочек). Если вам нужно использовать это из чего-то другого:

bash -c 'diff <(...) <(...)'
nerdwaller
источник
Как это сработает для рекурсивного сравнения, когда мне нужно сравнить два каталога?
Lanoxx
@lanoxx diff -r dir1 dir2для каталогов, чтобы ограничить его, вы, вероятно, захотите передать это чему-то другому. Если у вас есть конкретика, откройте новый вопрос и дайте ссылку здесь.
nerdwaller
Ну, в основном тот же вопрос, только рекурсивно: только различие (первые n строк | все, кроме первых n строк) для всех файлов в двух каталогах.
Lanoxx
@lanoxx, как я уже сказал, создайте новый вопрос и свяжите его. Для сообщества суперпользователей лучше не расширять сферу вопросов других пользователей.
nerdwaller
1
@Veridian Какую оболочку вы используете? Это специфично для bash, поэтому вам может понадобиться коллbash -c "diff <(...) <(...)"
nerdwaller
-1

diff -U (n строк) файл1 файл2

Andress
источник
1
Добро пожаловать в Супер пользователя! Можете ли вы рассказать немного об этом -Uаргументе? :)
bertieb