在linux中,如何在tsv文件列表(数百个)中查找单词列表(以千为单位),并将输出作为每个文件中每个字符串的匹配数?

在linux中,如何在tsv文件列表(数百个)中查找单词列表(以千为单位),并将输出作为每个文件中每个字符串的匹配数?,linux,csv,count,grep,match,Linux,Csv,Count,Grep,Match,我有数百个tsv文件,其结构如下(示例): 我有一个文本文件,其中包含单词列表(千): 我想得到输出,其中包含每个文件中出现的每个单词的数量,如下所示 GH1 GH2 GH3 ... GH1000 filename1 1 1 0... 4 . . . filename2 2 3 1... 0 我尝试了这个代码,但它只给了我零 for file in *.tsv; do echo $file >> output.tsv cat fore.txt | while re

我有数百个tsv文件,其结构如下(示例):

我有一个文本文件,其中包含单词列表(千):

我想得到输出,其中包含每个文件中出现的每个单词的数量,如下所示

 GH1 GH2 GH3 ... GH1000
filename1 1 1 0... 4
.
.
.
filename2 2 3 1... 0
我尝试了这个代码,但它只给了我零

for file in *.tsv; do
    echo $file >> output.tsv
    cat fore.txt | while read line; do
        awk -F "\\t" '{print $1}' $file | grep -wc $line >>output.tsv
        echo "\\t">>output.tsv;
    done ;
done

使用以下脚本

只需将sdtout放入output.txt文件

#!/bin/bash

while read p; do
    echo -n "$p "
done <words.txt

echo ""
for file in *.tsv; do
    echo -n "$file = "
    while read p; do
        COUNT=$(sed 's/$p/$p\n/g' $file | grep -c "$p")
        echo -n "$COUNT     "   
    done <words.txt
    echo ""
done


#/bin/bash
读p;做
回声-n“$p”

这里是一个简单的Awk脚本,它收集了一个类似于您描述的列表

awk 'BEGIN { printf "\t" }
    NR==FNR { a[$1] = n = FNR;
        printf "\t%s", $1; next }
    FNR==1 {
        if(f) { printf "%s", f;
            for (i=1; i<=n; i++)
                printf "\t%s", 0+b[i] }
        printf "\n"
        delete b
        f = FILENAME }
    $1 in a { b[$1]++ }' fore.txt *.tsv /etc/motd
awk'开始{printf\t}
NR==FNR{a[$1]=n=FNR;
printf“\t%s”,$1;下一个}
FNR==1{
若(f){printf“%s”,则f;

对于(i=1;它的效率非常低。您提供的复杂性是什么?此代码还生成表格格式的输出,但输出结果为零,表示与tsv文件中的单词不匹配。嗨,我尝试了此代码,它以表格格式给出结果,但计数结果为零。您的输入文件是否有DOS回车符?请取出它们然后重试。另请参见
#!/bin/bash

while read p; do
    echo -n "$p "
done <words.txt

echo ""
for file in *.tsv; do
    echo -n "$file = "
    while read p; do
        COUNT=$(sed 's/$p/$p\n/g' $file | grep -c "$p")
        echo -n "$COUNT     "   
    done <words.txt
    echo ""
done


awk 'BEGIN { printf "\t" }
    NR==FNR { a[$1] = n = FNR;
        printf "\t%s", $1; next }
    FNR==1 {
        if(f) { printf "%s", f;
            for (i=1; i<=n; i++)
                printf "\t%s", 0+b[i] }
        printf "\n"
        delete b
        f = FILENAME }
    $1 in a { b[$1]++ }' fore.txt *.tsv /etc/motd