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