Я использовал бы Perl для этого, или по крайней мере awk.
perl -ne '
BEGIN {
print "\"Job Name\", \"Time\", \"Schedule\", \"Machine\", \"Description\", \"Command\", \"\n";
}
chomp; s/^\s+//; s/\s+$//;
if (($_ eq "" || eof) && exists $fields{insert_job}) {
print "\"", join("\", \"", @fields{qw(insert_job start_times days_of_week machine description command)}), "\"\n";
delete @fields{qw(insert_job)};
}
if (/^([^ :]+): *(.*)/) {$fields{$1} = $2}
'
Объяснения:
BEGIN
блок выполняется однажды в начале сценария, остальное работает за каждой входной строкой.chomp
снимает изоляцию с ведущего и запаздывающего пробела.if
строка включает пустые строки (разделители абзацев), если поле insert_job
присутствует.delete
строка удаляет insert_job
поле. Добавьте другие имена полей, которых Вы не хотите выходить за пределы от одного абзаца до следующего.if
строка хранит поля.Если у Вас есть GNU uniq
, можно отсортировать нечувствительно к регистру (-i
), и использование -d
распечатать только дублирующиеся строки:
find . | sort -f | uniq -di
Как @StephaneChazelas упомянутый в его ответе, это не могло бы сделать то, что Вы ожидаете, могут ли у Вас быть дублирующиеся пути, которые только отличаются в случае, если (как a/b/foo
и A/b/foo
).
Принимающие имена файлов не содержат символы новой строки, Вы могли сделать что-то как:
find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d
Обратите внимание что некоторые tr
реализации как GNU tr
не изменяйте случай многобайтовых символов.
Также обратите внимание, что путь, о котором это сообщает, не может быть путями никакого файла. Например, если существует a ./a/b/fOo
и a ./A/b/fOo
файл, сообщит это ./a/b/foo
. Если это не то, что Вы хотите, можно хотеть совершенствовать требования.
Все эти идеи плохи. Используйте контрольные суммы и убедитесь, что файлы являются тем же. Затем задача становится легкой.
find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'
Этот будет sha1sum каждый файл в каталоге и всех подкаталогах и производить всех простофиль того файла, если будет кто-либо. Я сделал конвейерную мультилинию для удобочитаемости.
sort -f
здесь. Также отметьте тот GNUuniq
имеет то же ограничение как GNUtr
как в нем не работает на соответствие случаю многобайтовых символов. – Stéphane Chazelas 04.08.2013, 01:55sort -f
? Еслиuniq
может иметь дело со случаем, почему я должен был бы также сделатьsort
нечувствительный к регистру? И что Вы подразумеваете под многобайтовыми символами? Вещи как\n
,\r
и т.д.? Как у них могут быть различные случаи? – terdon♦ 04.08.2013, 03:19export LC_ALL=C; printf '%s\n' a A b B | sort | uniq -di
. Некоторый вид локалей нечувствительно к регистру, некоторые другие (как C) не делают.uniq
нуждается в отсортированном входе, его дублирующиеся строки должны быть смежными. – Stéphane Chazelas 04.08.2013, 10:25