내부 파일이 있습니다
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