grep -v命令后,轻松统计文件夹中文件列表中的单词

Vin*_*fer 6 bash grep wc

我一直在努力使我编写的脚本更简单,更简单.

有许多方法可以编写文件夹中所有文件的字数,甚至是文件夹子目录的所有文件.

例如,我可以写

wc */* 
Run Code Online (Sandbox Code Playgroud)

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

   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
Run Code Online (Sandbox Code Playgroud)

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

-bash: /usr/bin/wc: Argument list too long
Run Code Online (Sandbox Code Playgroud)

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

while read $FOLDER
do
    wc $FOLDER/* >> outfile.txt
done < "$FOLDER_LIST"
Run Code Online (Sandbox Code Playgroud)

所以这就是从一行到5行.

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

grep -v dbsnp */* | wc
Run Code Online (Sandbox Code Playgroud)

但这会有两个错误:

  1. 参数列表太长
  2. 如果它不是太长,它会立即为所有文件提供wc ,而不是每个文件.

所以,回顾一下,我希望能够做到这一点:

grep -v dbsnp */* wc > Outfile.txt
awk '{print $4,$1} Outfile.txt > Outfile.summary.txt
Run Code Online (Sandbox Code Playgroud)

让它像我上面所示的那样返回输出.

有一个非常简单的方法来做到这一点?或者我正在寻找一个最小的循环?再一次,我知道有101种方法可以像我们其他人一样使用4-10行脚本,但我希望能够在命令提示符中输入2个单行...我对shell的了解是还不够深入,知道哪些方式可以让我对操作系统的要求.

编辑 -

提出了一个解决方案:

find -exec grep -v dbsnp {} \; | xargs -n 1 wc
Run Code Online (Sandbox Code Playgroud)

此解决方案导致以下输出:

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 .
Run Code Online (Sandbox Code Playgroud)

就我所知,似乎将每一行都视为一个文件.我还在回顾其他答案,谢谢你的帮助.

Pra*_*ord 3

您提到“这并不能解决逐项归还厕所的问题”

以下将:

find -exec wc {} \;
Run Code Online (Sandbox Code Playgroud)

但这不会随您的grep过滤器一起提供"grep -v"

如果您打算按照我对此答案的评论进行操作,请检查以下内容是否适合您:

find -exec bash -c  "echo -n {}; grep -v dbsnp {} | wc " \;
Run Code Online (Sandbox Code Playgroud)