최대한 구체적이고 명확하게 설명하려고 노력하겠습니다.
파일이 있습니다. 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