Первая сортировка
входного файла
и уникальных (-u
) строк в первых двух столбцах -k1 ,2
и вырезать
третий столбец.
Затем переберите строки в pattern
и соберите третий столбец (sed
) из входного файла
. Наконец, удалите разрывы строк tr
и напечатайте совпадения.
pattern=$(sort -k1,2 -u < file | cut -d' ' -f1-2)
while read -r line
do
collect=$(sed -n 's/^'"$line"'//p' file | tr '\n' ' ')
echo "$line $collect"
done <<<"$pattern"
Предполагая, что вы ищете пары файлов - один с именем '.xml', а другой с именем '.md5', я бы занялся этим следующим образом:
#!/usr/bin/env perl
use strict;
use warnings;
foreach my $file ( glob ( "/path/to/dir/*.xml" ) ) {
print "MD5 is missing for $file\n" unless -f $file =~ s/\.xml$/\.md5/r;
}
Или как один лайнер:
perl -e 'print join "\n", grep { not -f s/\.xml$/\.md5/r } glob ( "/path/to/*.xml" )'
Оба делают в основном одно и то же
используют glob
, чтобы развернуть шаблон оболочки и получить соответствующий список файлов из xml
файлов.
Затем используйте шаблон замены (стиль sed), чтобы преобразовать расширение .xml
в .md5
- флаг r
означает «вернуть это значение. '(вместо того, чтобы изменять шаблон), чтобы мы могли использовать его в качестве имени файла ...
для передачи -f
filetest, чтобы проверить, существует ли он.
А затем распечатайте «отсутствующие» файлы, если подходящего нет.
Это должно быть довольно тривиально для адаптации к тесту на отсутствие XML для md5.
Следуя комментариям frmo - если вы получаете: «Неизвестное слово найдено там, где ожидался оператор в строке 6 ./file_list.pl, рядом с синтаксической ошибкой« s / \. Xml $ / \. Md5 / r »в ./file_list.pl строка 6, рядом с "s / \. xml $ / \. md5 / r"
Выполнение ./file_list.pl прервано из-за ошибок компиляции "это означает, что вы используете старую версию perl который не поддерживает флаг r
для регулярного выражения.
Это было добавлено в Perl 5.14 в 2011 году.
В качестве временного решения:
my $xml_file = $file;
$xml_file =~ s/\.xml$/\.md5/;
print "MD5 is missing for $file\n" unless -f $xml_file =~ s/\.xml$/\.md5/r;
Я предполагаю, что вы хотите обнаружить отсутствие файлов; либо отсутствует файл .md5
, либо отсутствует файл .xml
.
Циклический просмотр шаблонов *.md5
и *.xml
по очереди и обнаружение соответствующего файла «другого типа»:
#!/bin/sh
for name in./*.md5; do
if [ ! -e "${name%.md5}.xml" ]; then
printf '"%s" is missing its XML file\n' "$name"
fi
done
for name in./*.xml; do
if [ ! -e "${name%.xml}.md5" ]; then
printf '"%s" is missing its MD5 file\n' "$name"
fi
done
Расширение ${variable%word}
расширится до значения $variable
, с (кратчайшей )строкой, соответствующей word
, удаленной из его конца. Мы используем его здесь, чтобы удалить известный суффикс имени файла из значения переменной цикла. Затем мы добавляем другой суффикс к значению переменной и проверяем, является ли это именем существующего файла. В противном случае печатается соответствующее сообщение.
Проверка:
$ touch file{1..5}.xml file{2..7}.md5
$ ls
file1.xml file2.xml file3.xml file4.xml file5.xml file7.md5
file2.md5 file3.md5 file4.md5 file5.md5 file6.md5 script
$ sh script
"./file6.md5" is missing its XML file
"./file7.md5" is missing its XML file
"./file1.xml" is missing its MD5 file