【问题标题】:Sorting after using wc on files from a directory对目录中的文件使用 wc 后排序
【发布时间】:2020-03-15 23:57:16
【问题描述】:

指定一个命令/命令集,显示当前目录中.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"

问题是我不知道如何在不移动TOTAL 的情况下sort them alphabetically (considering we don't know how many files are in that folder)。我不确定上面的命令是否有效,所以如果你有更好的命令,你可以包含它的更多变体。

【问题讨论】:

  • to sort them - 如果您发布与显示的输入匹配的预期输出,那就太好了。您想使用文件名对其进行排序吗?

标签: linux shell ubuntu terminal wc


【解决方案1】:

也许更容易将输入参数排序为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

【讨论】:

  • 这个命令只剩下一个问题:如何从文件名中删除./?你能解释一下s/^total:/TOTAL:/在不修改文件名的情况下是如何工作的吗?
  • 你可以使用更多的 sed 来做到这一点:例如 sed 's|^\./||g' 将删除前导 ./ - 至于“无需修改文件名即可工作” - 除非文件名以 @987654331 开头,否则它可以工作@
  • 设法解决了那个问题。还有另一个问题:它显示隐藏文件。我该如何解决这个问题?
  • 当然可以使用更多的 sed 或 grep 或其他任何东西来过滤以 . 开头的文件
【解决方案2】:

您可以将输入保存到变量中,提取最后一行,对除最后一行之外的所有内容进行排序,然后输出最后一行:

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";
}

【讨论】:

  • 需要做的更短,在一个单行。正如我提到的那样,printf 也不起作用——考虑到我们不知道文件夹中有多少文件。
【解决方案3】:

这是一个使用 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) 满足排序部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多