У меня есть каталог с 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-файла.
Что является лучшим способом сделать это?
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[@]}
Простое решение, но не будет работать, если в файле есть переводы строки. имена очень многих файлов тоже учитываются:
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 ))
Использовать awk
:
awk 'END{FNUM=ARGC-1; print (NR-FNUM)/FNUM}' *.tsv