在linux中,如何在tsv文件列表(数百个)中查找单词列表(以千为单位),并将输出作为每个文件中每个字符串的匹配数?
我有数百个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
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