grep을 사용하고 awk 명령을 사용하여 유일한 항목을 찾으십시오.

grep을 사용하고 awk 명령을 사용하여 유일한 항목을 찾으십시오.

grep을 사용하고 awk를 사용하여 고유한 항목을 찾으면 해당 값이 파일에 나타나는 횟수와 파일 이름도 얻을 수 있습니까?

나는 이것을 시도했습니다 :

zgrep '2020-04-20|12345|' FILENAME_* |awk -F '|' '{print $2 "|" $3 "|" $4}' | sort | uniq -c

파일의 2,3,4열에 고유한 항목이 표시되지만 해당 항목이 있는 파일의 이름을 알고 싶습니다. 어떻게 해야 하나요?

답변1

~을 위한압축되지 않은그리고압축파일을 확인하고 다음을 시도해 보세요.

for f in FILENAME_*; do
    zcat -f "$f" | awk '/2020-04-20\|12345\|/ {rec=$2 "|" $3 "|" $4; a[rec]+=1}  
         END {for (rec in a) print FILENAME " : " rec " : " a[rec]}'
done  > output.txt

간략한 설명:

  • 먼저 와일드카드( *)를 사용하여 가능한 모든 파일 이름을 반복합니다.
  • 입력 파일의 압축을 풀 려면 zcat -f <filename>(참조1,2...) 필요한 경우 즉시 수행할 수 있습니다( -f옵션).
  • zcat -f <filename> | awk ...파일의 압축이 풀린 출력을 $f입력으로 사용합니다 awk.
  • 찾은 각 패턴에 대해 구문 분석된 레코드의 값이 발견될 때마다 2020-04-20|12345|상관 계수 배열이 증가합니다 .a$2 | $3 | $4awk
  • END파일( 청크) 및 rec연관 배열의 각 구성 요소 에 대한 구문 분석을 마치면 a연결은 파일 이름 "FILENAME", rec$2 | $3 | $4및 해당 값이 발생한 횟수를 인쇄합니다 a[rec].
  • awk현재 처리된 파일 'FILENAME'의 이름과 같은 몇 가지 편리한 내부 변수를 사용할 수 있도록 합니다.
  • for루프의 연속 출력에 대한 단일 리디렉션은 output.txt완전히 선택 사항입니다. 억제하면 stdout.

=====================================

정답은편집하다@AdminBee, @roaima, @dave_thompson 및 @kusalananda의 유용한 의견을 바탕으로 개선되었습니다.

관련 정보