如何在 UNIX Shell 脚本中添加所有同名文件的大小

如何在 UNIX Shell 脚本中添加所有同名文件的大小

我是新手,我想问如何添加同名文件的大小?我的文件名实际上彼此不同,但我将它们剪切下来,以便获得分组在一起的文件。

这是我的原始文件及其大小(样本)

sample.txt 里面有以下数据:

  1. 12345 a_1.txt
  2. 12234 b_1.txt
  3. 32123 c_1.txt
  4. 11122 a_2.txt

现在我剪切了sample.txt里面的文件名,去掉了以“_”(下划线)开头的字符。它们变成了这样:

  1. 12345 一
  2. 12234 百
  3. 32123 号
  4. 11122 一

现在我想将所有文件名相同的文件的大小相加,如上所示。输出应如下所示:

  1. 23467 一
  2. 12234 百
  3. 32123 号

请帮忙。非常感谢大家。我在这里被困了好几个小时了

答案1

假设没有行号sample.txt

cut -f 1 -d _ sample.txt | awk '{a[$2] += $1} END{for (i in a) print a[i], i}'

您可能希望| sort -k 2在最后添加。


EDIT1-按要求解释:

cut命令会用_分隔符剪切每一行并仅保存第一部分。您已对原始文件执行此操作。

然后该awk命令在每一行中找到两个字段。我们称它们为尺寸姓名,但在内部awk将它们称为$1$2。对于每一行,它都会增加一个数组元素a(名称a是任意选择的,与示例中的文件名无关)。姓名 $2告诉要增加哪个元素——它是一个索引;尺寸 $1是增量值。awk足够聪明,可以初始化a元素,0因为它是第一次提到的。 每次其索引(姓名) 作为输入行的第二个字段出现。最后(输入的最后一行之后)awk遍历每个已知的索引a并打印值(现在是累计大小) 和指数 (姓名)。

答案2

要获得以 开头的每个文件的总数,a_ 您可以这样做:

du -c a_*  | grep total

du计算所有文件的大小,然后-c计算总大小。grep 只提取总大小,而不是提取所有单个文件。

相关内容