14가지 패턴에 대해 100개의 파일을 검색하고 싶습니다. 내가 지금까지 시도한 것
cat s_3_2_*_qseq.txt | grep -c 'pattern1\|pattern2\|pattern3\|pattern4\|pattern5\|...pattern14'
이것은 나에게 각 파일의 모든 패턴의 수를 제공합니다
s_3_3_001_qseq.txt:12
s_3_3_002_qseq.txt:15
.
s_3_3_0068_qseq.txt:5
다음과 같이 각 모드의 결과를 개별적으로 확인하고 싶습니다.
file pattern1 pattern2 ..... pattern14
s_3_3_001_qseq.txt: 0 2 5
s_3_3_002_qseq.txt: 7 1 3
.
.
s_3_3_0068_qseq.txt: 1 2 1
이 작업을 어떻게 수행해야 하는지에 대한 아이디어가 있으면 Unix, Perl 또는 Python 솔루션이 좋을 것입니다.
답변1
awk 솔루션 - 코드를 정리하거나 단축할 수 있습니다. 확신합니다.
$ cat file1
pat1
pat2
pat1
$ cat file2
pat2
pat2
pat1
$ awk -f 1.awk file1 file2
file pat1 pat2
file1 2 1
file2 1 2
$ cat 1.awk
BEGIN{
pat["pat1"]="pat1";
pat["pat2"]="pat2";
file["file1"]="file1";
file["file2"]="file2"
}
{
for (i in pat) {
if ($0 ~ i) pat_count[FILENAME,i]++
}
}
END {
printf("file\t\t")
for(i in pat) {
printf("%s\t\t",i)
}
printf("\n")
for (i in file) {
printf("%s\t\t",i)
for(j in pat) {
printf("%d\t\t", pat_count[i,j])
} ; printf("\n")
}
}
답변2
awk를 사용하세요:
검색이라는 쉼표로 구분된 변수로 검색어를 제공합니다.
$ cat a
alice
bob
john
$ cat b
alice
bob
$ cat c
alice
$ cat search-count.awk
BEGIN {
# read search terms
split(search, searches, /,/)
delim=":"
# fill initially zero count for all searches
for (f = 1; f < ARGC; f++)
for (s in searches)
matches[searches[s],delim,ARGV[f]] = 0
}
{
for (s in searches) {
if ($0 ~ searches[s]) {
matches[searches[s],delim,FILENAME]++
}
}
}
END {
# print header
printf "FILE"
for (s in searches) {
printf "\t%s", searches[s]
}
printf "\n"
# print counts
for (f = 1; f < ARGC; f++) {
printf ARGV[f]
for (s in searches) {
printf "\t%s", matches[searches[s],delim,ARGV[f]]
}
printf "\n"
}
}
$ awk -v search="alice,bob,john" -f ./search-count.awk a b c
FILE alice bob john
a 2 2 0
b 1 1 0
c 0 2 0
답변3
PATTERNS=(dummy pattern1 pattern2 ... pattern14) ; dummy to occupy index zero
for file in /path/to/my/files/*
do
for p in 1 2 3 4 5 6 7 8 9 10 11 12 13 14
printf ${file}"\t"
do
c=$(grep -c PATTERNS[${p}] ${file}) # depending on the nature of your pattern you may need quotes around it
printf ${c}"\t"
done
echo
done
이와 같은 것이 작동할 수 있습니다(구문은 확인되지 않았습니다. 사용하기로 결정한 경우 주의하세요).