Сортировка после использования w c для файлов из каталога - PullRequest
0 голосов
/ 16 марта 2020

Укажите команду / набор команд, которые отображают количество строк кода в файлах .c и .h в текущем каталоге, отображая каждый файл в алфавитном порядке, затем следуют : и количество строк в файлы и, наконец, сумма строк кода. , Пример, который может отображаться:

main.c: 202
util.c: 124
util.h: 43
TOTAL: 369

После многих попыток мой окончательный результат однострочной команды был:

wc -l *.c *.h | awk '{print $2 ": " $1}' | sed "$ s/total/TOTAL/g"

Проблема в том, что я не знать, как sort them alphabetically не перемещая TOTAL, а также (considering we don't know how many files are in that folder). Я не уверен, что приведенная выше команда настолько эффективна, поэтому, если у вас есть лучшая, вы можете включить больше ее вариантов.

Ответы [ 3 ]

1 голос
/ 16 марта 2020

возможно, проще было бы отсортировать входные аргументы в wc - возможно, что-то вроде этого:

$ find . -maxdepth 1 '(' -name '*.py' -o -name '*.md' ')' | sort | xargs -d'\n' wc -l | awk '{print $2": "$1}' | sed 's/^total:/TOTAL:/'
./__main__.py: 70
./README.md: 96
./SCREENS.md: 76
./setup.py: 2
./t.py: 10
TOTAL: 254

обратите внимание, что я использую xargs -d'\n', чтобы избежать имен файлов с пробелами в них (если бы я был нацеливаясь на GNU +, я бы сбросил . с find . и, возможно, вместо этого использовал бы -print0 | sort -z | xargs -0)

0 голосов
/ 16 марта 2020

вот ответ meme-ier, который использует python3.8 + (эй awk завершается, почему бы не использовать python?)

python3.8 -c 'import sys;s=0;[print(x+":",-s+(s:=s+len(list(open(x)))))for x in sorted(sys.argv[1:])];print("TOTAL:",s)' *.py *.cfg
__main__.py: 70
setup.cfg: 55
setup.py: 2
t.py: 10
TOTAL: 137

, расширяя его, он злоупотребляет несколькими вещами:

  • len(list(open(x))) - open(x) возвращает файл, list исчерпывает итератор (по строкам), а затем его длина равна числу строк
  • -s+(s:=s+...) - это выражение присваивания, побочным эффектом которого является накопление s, но с выражением, равным разности (...)
  • sorted(sys.argv), удовлетворяет части сортировки
0 голосов
/ 16 марта 2020

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

printf '%s\n' 'main.c: 202' 'util.c: 124' 'util.h: 43' 'TOTAL: 369' | {
    v=$(cat);
    total=$(tail -n1 <<<"$v");
    head -n-1 <<<"$v" | sort -r;
    printf "%s\n" "$total";
}
...