Как узнать среднее количество строк в каталоге?

У меня есть каталог с 78 .tsv файлами. Я хочу найти среднее количество строк для всех файлов в каталоге.

Я использую tail -n +2 $ i | wc -l; done> line_numbers.txt , чтобы получить количество строк, исключая заголовок файла для вывода в текстовый файл. Вывод txt-файла будет выглядеть следующим образом:

0
10
2
12
14
10
7
13
10
25
14
13
14
...

Но я хочу просто напечатать среднее число строк для всего каталога, а не вычислять среднее значение из вывода txt-файла.

Что является лучшим способом сделать это?

0
задан 13 July 2020 в 16:37

3 ответа

bc -l <<< $(tail -q -n+2 *.csv | wc -l)/$(ls *.csv | wc -l)
#            ~~ Data lines ~~~~   Count    ~ Files ~  Count

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

csv_files=(*.csv)
bc -l <<< $(tail -q -n+2 *.csv | wc -l)/${#csv_files[@]}
0
ответ дан 30 July 2020 в 22:09

Простое решение, но не будет работать, если в файле есть переводы строки. имена очень многих файлов тоже учитываются:

files=$(ls *.tsv | wc -l)
lines=$(cat *.tsv | wc -l)
average=$(( (lines-files)/files ))

Более надежное решение, которое будет обрабатывать странные имена файлов и большое количество файлов:

names=(*.tsv)
files=${#names[@]}
lines=$(printf '%s\0' "${names[@]}" | xargs -0 cat | wc -l)
average=$(( (lines-files)/files ))
1
ответ дан 30 July 2020 в 22:09

Использовать awk :

awk 'END{FNUM=ARGC-1; print (NR-FNUM)/FNUM}' *.tsv
2
ответ дан 30 July 2020 в 22:09

Другие вопросы по тегам:

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