쉘 스크립트의 파일 작업

쉘 스크립트의 파일 작업

고유 패턴으로 시작하는 행 수를 추출하고 패턴과 발생 횟수를 다음 형식으로 인쇄해야 합니다. 패턴 구분 기호는 /여야 합니다.

file.txt에는 다음 항목이 포함되어 있습니다.

path1/path1/Dockerfile
path1/path1/path1.config
path2/inputdir/Dockerfile
path2/inputdir/path1.config
path2/outputdir/path1.config
pipelines/pipeline1.yml
pipelines/jobs/job1.yml

출력은 다음과 같아야합니다

path1=2
path2=3
pipelines=2

다음과 같이 awk를 사용하고 있지만 입력으로 패턴 일치가 필요합니다(예: path1, 동적 드라이버가 필요합니다.

awk '/^path1/{a++}END{print a}' files.txt

누구든지 이것에 대해 조언을 할 수 있습니까? 감사해요.

답변1

각 최상위 디렉터리 이름의 개수를 추적하려고 합니다. 이는 awk디렉터리 이름을 키로 사용하는 연관 배열을 사용하는 가장 간단한 방법입니다 . 그런 다음 /디렉터리 이름(첫 번째 필드)에 쉽게 액세스할 수 있도록 각 줄을 구분된 필드 집합으로 읽을 수 있습니다 .

awk -F / '{ count[$1]++ } END { for (name in count) printf "%s=%s\n", name, count[name] }' file

여러 줄 레이아웃을 사용하는 코드:

awk -F / '
    { count[$1]++ }
    END {
        for (name in count)
            printf "%s=%s\n", name, count[name]
    }' file

이것은향수를 불러일으키는자신만의 코드이지만 각 줄의 시작 부분에 있는 특정 문자열을 일치시키려고 시도하지는 않습니다. 대신 필드가 /(명령줄에서 주문한 -F /)로 구분되어 있다는 점을 고려하여 로 첫 번째 필드를 선택합니다 $1.

그러면 첫 번째 필드의 값이 이름이 지정된 배열의 키로 사용됩니다 count. 스칼라 변수를 사용하고 있지만 a배열을 사용 awk하면 다양한 값을 한 번에 추적할 수 있으므로 첫 번째 필드와 관련된 값만 증가시키면 됩니다.

count마지막으로 배열에서 수집된 모든 키를 반복하여 각 키와 관련된 값과 함께 인쇄합니다.

출력은 순서가 없으며 awk사용 중인 항목에 따라 명령을 실행할 때마다 다른 순서로 나타날 수 있습니다.


출력 형식이 그다지 중요하지 않은 경우 첫 번째 필드를 잘라내고 cut정렬한 다음(데이터가 아직 정렬되지 않은 경우) 고유 문자열 수를 계산하여 이 문제를 해결할 수도 있습니다.

$ cut -d / -f 1 file | sort | uniq -c
   2 path1
   3 path2
   2 pipelines

관련 정보