首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按grep -v命令轻松计数文件夹中文件列表中的单词

按grep -v命令轻松计数文件夹中文件列表中的单词
EN

Stack Overflow用户
提问于 2014-06-05 06:15:20
回答 4查看 2.1K关注 0票数 6

我一直在努力使我写的脚本变得越来越简单。

有很多种方法可以获取文件夹中所有文件的单词数,甚至一个文件夹的子目录中的所有文件。

例如,我可以写

代码语言:javascript
复制
wc */* 

我可能得到这样的输出(这是所需的输出):

代码语言:javascript
复制
   0        0        0 10.53400000/YRI.GS000018623.NONSENSE.vcf
   0        0        0 10.53400000/YRI.GS000018623.NONSTOP.vcf
   0        0        0 10.53400000/YRI.GS000018623.PFAM.vcf
   0        0        0 10.53400000/YRI.GS000018623.SPAN.vcf
   0        0        0 10.53400000/YRI.GS000018623.SVLEN.vcf
   2       20      624 10.53400000/YRI.GS000018623.SVTYPE.vcf
   2       20      676 10.53400000/YRI.GS000018623.SYNONYMOUS.vcf
  13      130     4435 10.53400000/YRI.GS000018623.TSS-UPSTREAM.vcf
 425     4250   126381 10.53400000/YRI.GS000018623.UNKNOWN-INC.vcf

但是,如果文件太多,我可能会收到如下错误消息:

代码语言:javascript
复制
-bash: /usr/bin/wc: Argument list too long

因此,我可以创建一个变量,一次只做一个文件夹,如下所示:

代码语言:javascript
复制
while read $FOLDER
do
    wc $FOLDER/* >> outfile.txt
done < "$FOLDER_LIST"

从一行到第五行,就像这样。

此外,在一种情况下,我想首先使用grep -v,然后执行单词计数,如下所示:

代码语言:javascript
复制
grep -v dbsnp */* | wc

但这将受到两个错误的影响:

  1. 参数列表太长
  2. 如果它不是太长,它将为所有文件同时提供wc,而不是每个文件。

因此,简单地说,我很乐意这样做:

代码语言:javascript
复制
grep -v dbsnp */* wc > Outfile.txt
awk '{print $4,$1} Outfile.txt > Outfile.summary.txt

让它像上面显示的那样返回输出。

有什么很简单的方法吗?还是我至少在看一个循环?同样,我知道101种方法,就像我们使用4-10行脚本一样,但我希望能够只在命令prompt...and中键入2行代码--我对shell的了解还不够深入,无法知道我对操作系统的要求是什么。

编辑-

提出了一项解决办法:

代码语言:javascript
复制
find -exec grep -v dbsnp {} \; | xargs -n 1 wc

此解决方案将产生以下输出:

代码语言:javascript
复制
wc: 1|0:53458644:AMBIGUOUS:CCAGGGC|-16&GCCAGGGCCAGGGC|-18&GCCAGGGCC|-19&GGCCAGGGC|-19&GCCAGGGCG|-19,.:48:48,48:4,4:0,17:-48,0,-48:0,0,-17:27:3,24:24: No such file or directory
wc: 10: No such file or directory
wc: 53460829: No such file or directory
wc: .: Is a directory
      0       0       0 .
wc: AA: No such file or directory
wc: CT: No such file or directory
wc: .: Is a directory
      0       0       0 .
wc: .: Is a directory
      0       0       0 .

据我所知,似乎每一行都是一个文件。我还在复习其他的答案,谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-05 07:24:01

您提到,“这并不能解决逐项返回wc的问题”。

下列遗嘱:

代码语言:javascript
复制
find -exec wc {} \;

但这不会随你的grep过滤器"grep -v"

如果你打算按照我对这个答复的评论做同样的事,那么请检查以下是否对你有用:

代码语言:javascript
复制
find -exec bash -c  "echo -n {}; grep -v dbsnp {} | wc " \;
票数 3
EN

Stack Overflow用户

发布于 2014-06-05 06:20:12

*/*的匹配太多了,所以grep会收到一个长的参数列表。您可以使用find来规避这一问题:

代码语言:javascript
复制
find -exec grep -v dbsnp {} \; | wc

也许您也希望消除可能的遍历错误:

代码语言:javascript
复制
find -exec grep -v dbsnp {} \; 2> /dev/null | wc
票数 2
EN

Stack Overflow用户

发布于 2014-06-05 06:39:43

这对我来说很管用:

代码语言:javascript
复制
grep -or "[a-zA-Z]*" * | cut -d":" -f2 | sort | uniq -c

你要看的是MapReduce算法http://en.wikipedia.org/wiki/MapReduce

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24052876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档