awk 출력이 검색하는 파일의 각 문자열 수를 계산합니다.

awk 출력이 검색하는 파일의 각 문자열 수를 계산합니다.

최대한 구체적이고 명확하게 설명하려고 노력하겠습니다.

파일이 있습니다. log.txt여러 문자열이 포함되어 있습니다. 이 문자열을 검색하여 인쇄하고 계산합니다.

일치하는 파일의 열만 인쇄하는 명령은 다음과 같습니다 log.txt.

sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}'

설명하다

sed -n '1p' //prints the first line
awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}' //prints the next columns from the number 25 column

입력하다:

Column25 Column26 Column27 ColumnN <--#first filter:I need obtain specific headers.                    ColumnN 
Column25         Column27 ColumnN
        Column26 Column27  <--#Count how many times is repeat every string in whole file

산출:

Column25
Column26
Column27
Column28
Column29
ColumnN

나는 이것을 시도한다:file.log이전 출력에서 ​​동일한 파일의 동일한 명령에서 모든 우연의 일치를 계산하고 싶습니다 .

sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}'

다음과 같이 다시 출력으로 보냅니다.

원하는 출력:

Column25 - n times
Column26 - n times
Column27 - n times
Column28 - n times
Column29 - n times
ColumnN - n times

추신. 검색을 시작하기 위해 for 루프에서 동일한 변수를 사용하는 것을 고려했지만 "$s"작동하지 않습니다.

답변1

이 문제를 해결한 방법은 다음과 같습니다.

awk '{n=1;if(NR==1)n=25;for(i=n;i<=NF;i++) a[$i]++} END{for(val in a) print val,a[val]}' input.txt

첫 번째 행에서 필드 25 이상을 캡처하려면 NR변수를 확인하고 n루프에 사용될 변수를 설정해야 합니다. 이는 a[$i]++필드가 키이고 배열의 값이 ++연산자에 의해 증가되는 연관 배열이 됩니다. 이것은 awk의 매우 일반적인 필드 계산 방법입니다.

답변2

어때요?

awk '{for (i=25; i<=NF; i++) print $i; exit}' file | sort | uniq -c
  6 string1
  6 string2
  6 string3
  6 string4
  6 string5
  6 stringN

편집하다:새로 추가된 예시 입력에는 계산이 시작되기 전에 무시할 24개의 필드가 없으며 첫 번째 행(첫 번째 코드 조각에서 유추됨)에 대한 제한이 사라진 것 같습니다. 노력하다

tr -s ' ' '\n' <file |  sort | uniq -c
  2 Column1
  2 Column2
  3 Column3
  3 ColumnN

관련 정보