Как подсчитать вхождения каждого слова, принадлежащего файлу, во всем `n` числе файлов, переданных в качестве аргументов?

noauto все равно будет возвращать ошибку (stderr) во время загрузки, если источник недоступен.

nofail удалит проверку ошибок.

nofail без указания x-systemd.device-timeout = по умолчанию будет использовать тайм-аут 90 секунд, хотя, когда источник недоступен и вы или процесс пытаетесь смонтировать его вручную.

Примечание: x-systemd.device-timeout = 0 устанавливает бесконечный тайм-аут.

Редактировать: Цитата

nofail Не сообщать об ошибках для этого устройства, если оно не существует.

http://man7.org/linux/man-pages/man8/mount.8.html

1
26.11.2018, 01:10
3 ответа

Вы можете перебирать список файлов, указанный в командной строке, следующим образом:

for file in "$@"
do
    echo "Considering file ==> $file <=="
done

Ваш метод сопоставления слов должен быть совершенно эффективным. Вы также можете искать вхождения слова, используяgrep -o

echo 'I can cry cryogenic tears when I scry my hands. Can you cry too?' |
    grep -o '\bcry\b'    # \b marks a word boundary

Передача результата этого в wc -lдаст вам количество вхождений во входном потоке.

Использование $(... )позволяет интерполировать вывод команды в текст, используемый другой командой. Например

echo "The date and time right now is $(date)"

Нам потребуется дополнительная работа, чтобы не искать первый файл, а вместо этого использовать его как список слов. Но, собрав это вместе, вы можете получить что-то вроде этого:

wordfile="$1"
wordlist=($(cat "$wordfile"))
shift

for file in "$@"
do
    for word in "${wordlist[@]}"
    do
        # echo "$file: $word:" $(grep -o "\b${word}\b" "$file" | wc -l)  # My way
        echo "$file: $word:" $(tr ' ' '\n' <"$file" | grep -c "$word")   # Your way
    done
done

Это не очень эффективно, потому что N слов будет искать каждый файл N раз. Вы можете найти, что grep -fпоможет здесь.

2
27.01.2020, 23:18

Я бы сделал:

#! /bin/sh -
# usage: wordcount <file-with-words-to-search-for> [<file>...]
words=$(tr -s '[[:space:]]' '[\n*]' < "${1?No word list provided}" | grep.)
[ -n "$words" ] || exit

shift
for file do
  printf 'File: %s\n' "$file"
  tr -s '[[:space:]]' '[\n*]' | grep -Fxe "$words" | sort | uniq -c | sort -rn
done

(который подсчитывает только слова, которые встречаются хотя бы один раз в каждом файле ).

3
27.01.2020, 23:18
fgrep -cw 'word' file1 file2... fileN

Это выведет следующее:

file1:4
file2:16

и так далее, по одному в строке. Если это просто сумма всех файлов, сделайте что-то вроде этого:

echo "Total: $(( $(fgrep -cw 'word' file1 file2... fileN | awk -F: '{ print $NF" + " }') 0 ))"

, который будет выводить:

Total: 20
0
27.01.2020, 23:18

Теги

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