이러한 참조가 포함된 파일 폴더 내에서 파일 참조 수를 어떻게 얻을 수 있나요?

이러한 참조가 포함된 파일 폴더 내에서 파일 참조 수를 어떻게 얻을 수 있나요?

음, 두 개의 폴더가 있습니다. 단순화를 위해 playerssum 이라고 부르겠습니다 items. items 폴더에는 각 항목에 대한 파일이 포함되어 있고, people 폴더에는 각 사람에 대한 파일이 포함되어 있으며, 여기에는 해당 사람이 소유한 동물에 대한 참조가 포함되어 있습니다. 이것이 내가 지금까지 가지고 있는 것입니다:

ls -1 ~/items | cut -d. -f1 | grep -R -f - ~/player

내가 얻은 grep 구문여기. 나는 그것을 말하려고 노력하고 있습니다 :

electric: 8
laser: 7
loltrail: 2

-c대신 플래그를 추가 grep하고 다음을 얻습니다.

Bob.txt: 0
Cathy.txt: 0
John.txt: 0
Patrick.txt: 1

1인당 물품 개수가 아닌 총 물품 개수를 구하려면 어떻게 해야 하나요?

이는 얼마나 많은 프로젝트가 사용 중인지 파악하는 것입니다.매장을 클릭하세요Garry's Mod용 플러그인.

답변1

GNU를 사용하여 원하는 결과를 얻는 방법은 다음과 같습니다 awk.

awk '
    BEGINFILE {
        if (FILENAME ~ "^animals/"  ||  FILENAME ~ "/animals/") {
                this_name = substr(FILENAME, index(FILENAME,"animals/")+length("animals/"))
                i = index(this_name, ".")
                if (i > 0) this_name = substr(this_name, 1, i-1)
                critter[++num] = this_name
                critter_count[num] = 0
                nextfile
        }
    }
    {
        for (i = 1; i <= num; i++) {
                if ($0 ~ critter[i]) critter_count[i]++
        }
    }
    END {
        for (i = 1; i <= num; i++) print critter[i] ": " critter_count[i]
    }
'  animals/*  people/*
  • 새 파일( )을 시작할 때 BEGINFILE이름이 , 또는 animals/로 시작하는지 확인하세요 /animals/. 그렇다면,animals/*./animals/*~/animals/*

    • 오른쪽 부분 문자열을 추출합니다 animals/.
    • 그런 다음 하나를 찾고 ., 발견되면 왼쪽에 있는 하위 문자열을 추출합니다.
    • 이 문자열(기본 파일 이름, 제거된 디렉터리 및 확장자)을 critter[]배열에 추가하고 해당 문자열을 critter_count0으로 초기화합니다.

    ☛ POSIX awk에서는 BEGINFILE및를 nextfile사용할 수 없습니다.

  • 그렇지 않은 경우(파일을 보고 있는 경우 people) 동물 이름을 반복하여 critter일치하는 줄 수를 셉니다.
  • 모든 입력 에 도달 한 후 END파일 이름에서 추출된 동물 이름 animals과 각 동물 이름이 파일에 나타나는 빈도를 보고합니다 people.

이것은 디렉토리를 재귀적으로 검색하지 않습니다 people. 질문에 필요한 설명이 표시되지 않습니다.

답변2

grepusing 에 패턴을 입력하면 stdin모든 패턴의 결과가 연결될 것이라고 생각합니다. 제가 아는 한, 이 문제를 해결하는 유일한 방법은 각 패턴에 대해 새로운 grep 인스턴스를 호출하는 것입니다.

이 스크립트는 이 경우에 작동합니다.

for animalName in $(ls -1 ~/animals | cut -d. -f1);
    do
        echo "$animalName: $(grep -R -h -c $animalName ~/people | paste -sd+ | bc)";
done

이는 시도한 사소한 변경 사항 중 일부와 일치합니다. 첫째, -h옵션은 grep파일 이름 인쇄를 비활성화합니다. 둘째, 을 사용하면 grep패턴의 출력은 다음과 유사합니다.

1
0
3
2

우리는 이 숫자를 모두 더하고 싶습니다. paste이 명령은 행을 a와 연결 +한 다음 결과 문자열을 전달하여 bc결과를 계산합니다.

참고: 동물 이름에 줄 바꿈이나 특수 문자(이상한 위치)가 포함된 경우 구문 분석을 권장하지 않습니다 ls.

관련 정보