Поиск строки при чтении — быстрее с perl?

Проблема была в том, :что я идиот.

На самом деле аппаратное обеспечение — это Azulle Inspire, а вовсе не NUC. Я бы хотел, чтобы производители наклеили одинаковые этикетки на этот лабиринт извилистых маленьких черных коробочек.

Чтобы войти в BIOS на одном из них, несколько раз нажмите DEL.

Я до сих пор не знаю, как вывести 8-канальный звук через порт HDMI, но это уже другой вопрос.

0
19.01.2021, 01:32
2 ответа

Вы можете попробовать это, если ваши имена файлов не содержат табуляции или новой строки:

find. -type f -print |
awk '
    NR==FNR {
        name2ids[$3][1] = $1
        name2ids[$3][2] = $2
        next
    }
    {
        for (name in name2ids) {
            if ( index($NF,name) ) {
                matches[name][$0]
            }
        }
    }
    END {
        for (name in name2ids) {
            print "ID1 =", name2ids[name][1]
            print "ID2 =", name2ids[name][2]
            print "\nPath:"
            if (name in matches) {
                for (file in matches[name]) {
                    print file
                }
            }
        }
    }
' FS='\t' SearchList.txt FS='/' -

В приведенном выше примере используется GNU awk для массивов массивов, здесь версия POSIX (не проверена):

find. -type f -print |
awk '
    NR==FNR {
        name2ids[$3] = $1 RS $2
        next
    }
    {
        for (name in name2ids) {
            if ( index($NF,name) ) {
                matches[name] = (name in matches ? matches[name] RS : "") $0
            }
        }
    }
    END {
        for (name in name2ids) {
            split(name2ids[name],ids,RS)
            print "ID1 =", ids[1]
            print "ID2 =", ids[2]
            print "\nPath:"
            split(matches[name],files,RS)
            for (idx in files) {
                print files[idx]
            }
        }
    }
' FS='\t' SearchList.txt FS='/' -
0
18.03.2021, 22:35

Проверка вашего кода bash:

  • readможет подобрать вам слова
  • echo "\n" не будет печатать новую строку
  • используйте $(...)вместо`...`-ссылка
  • используйте правильный отступ Будьте осторожнее с символами перенаправления
while read -r var1 var2 var3 rest; do
    printf "\n ID1 = %s \n ID2 = %s \n\n Path:\n" "$var1" "$var2"
    find //myDirectory/ -type f -name "*$var3*" -not -path '*/zz_masters/*' -exec ls -Sd {} +
    #........................ quoted ^.......^
    printf "\n----------------------\n"; 
done < /SearchList.txt > /ResultList.txt

Однако способ ускорить это — запустить findтолько один раз:

id1=()
id2=()
substrings=()
names=( -false )
declare -A paths=()

while read -r var1 var2 var3 rest; do
    id1+=( "$var1" )
    id2+=( "$var2" )
    substrings+=( "*$var3*" )
    names+=( -o -name "*$var3*" )
done < /SearchList.txt 


find /myDirectory/ -type f \( "${names[@]}" \) -not -path '*/zz_masters/*' -prinf "%s %p\0" \
| sort -znr \
| while read -d '' -r size name; do
    for s in "${substrings[@]}"; do
        if [[ $name == *"$s"* ]]; then
            paths[$s]+="$name"$'\n'
            break
        fi
    done
done

fmt="\n ID1 = %s \n ID2 = %s \n\n Path:\n%s\n----------------------\n"

for idx in "${!id1[@]}"; do
    printf "$fmt" "${id1[idx]}" "${id2[idx]}" "${paths[${substrings[idx]}]}"
done > /ResultList.txt
2
18.03.2021, 22:35

Теги

Похожие вопросы