여러 grep에서 각 패턴에 대해 별도의 결과를 얻는 방법

여러 grep에서 각 패턴에 대해 별도의 결과를 얻는 방법

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

이와 같은 것이 작동할 수 있습니다(구문은 확인되지 않았습니다. 사용하기로 결정한 경우 주의하세요).

관련 정보