awk에서 필터를 사용하여 동일한 출력 파일에 출력 줄 수를 추가할 수 있습니까?

awk에서 필터를 사용하여 동일한 출력 파일에 출력 줄 수를 추가할 수 있습니까?

내부 파일이 있습니다

11111
444
989
5512
121318

그래서 다음과 같은 outfile을 생성하는 awk 명령을 배치하고 싶습니다.outfile has ${thesemany} matches

이 경우 outfile다음과 같습니다.

outfile has 2 matches
11111
121318

블록 을 해봐야 할 것 같은데 END이 줄이 시작 부분에 있어야 합니다. BEGIN& 블록과 증가 연산자를 삽입할 위치에 대해 너무 END혼란스럽습니다 .

내 것은 불완전하다awk-one-liner

awk 'BEGIN {print "outfile has ${thesemany} matches"} {(length($1) >= 5) print $1}' infile > outfile

답변1

이전에 일치하는 항목 수를 알 수 없다는 점을 감안할 때 이후에 일치 항목 자체를 인쇄하려면 해당 항목을 1END 에 저장해야 합니다 . 예를 들면 다음과 같습니다 .END

awk '
  length($1) >= 5 {matches = matches (matches ? ORS : "") $1; count++} 
  END {print "outfile has " count+0 " matches"; if(count) print matches}
' infile

출력 순서에 관심이 없거나 일치하는 항목을 정렬하려는 경우 연결된 문자열 대신 배열에 저장할 수 있습니다.


1 다음과 같이 외부에서 일치 항목을 버퍼링할 수 있다고 생각합니다.awk 'length($1) >= 5 {count++; print $1 | "cat"} END {print "outfile has " count+0 " matches"; close("cat")}' infile

답변2

일치하는 모든 필드를 임시 배열에 저장하고 END 규칙에 배열을 덤프할 수 있습니다.

awk 'length($1) >= 5 {a[$1]; count++; } END {print "outfile has", count, "matches"; for (elem in a) {print elem}}' infile

관련 정보