여러 파일에서 한 줄의 발생 횟수를 계산합니다.

여러 파일에서 한 줄의 발생 횟수를 계산합니다.

일부 로그 파일이 있는데 이를 수집하여 특정 줄의 발생 횟수를 계산해야 합니다.

문제는 첫 번째 파일의 특정 줄부터 시작하여 해당 줄 이후의 항목만 계산해야 한다는 것입니다. 다른 모든 파일은 철저하게 검색해야 합니다. 첫 번째 파일만 마지막 x 줄로 제한하면 됩니다.

그런 다음 결과에 200을 곱해야 합니다. 하나의 명령으로 이 작업을 수행하고 싶습니다.

이것은 2개의 로그 파일을 사용하는 실제 예제이지만 곧 이를 3개의 파일로 확장해야 하며 누군가가 이를 수행하는 더 나은 방법을 알아낼 수 있기를 바랍니다.

expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc

답변1

두 번째 고양이 다음에 세 번째 파일을 추가할 수 있어야 한다고 생각합니다.

expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log Log3.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc

예:

$ echo abc > 1.txt 
$ echo cde > 2.txt 
$ echo def > 3.txt 
$ cat 1.txt 2.txt 3.txt | grep d 
cde 
def

답변2

파일 수에 관계없이 일반적인 솔루션:

 for file1 in log1.txt log2.txt logN.txt; do
   for file2 in logA.txt logB.txt logC.txt; do
     for file3 in logD.txt logE.txt logF.txt; do
     match1=$(tail -n 5147 $file1 | grep -c 'The line');
     match2=$(grep -c "the line" $file2);
     match3=$(grep -c "the line" $file3);
     echo "($match1 + $match2 + $match3) * 200" | bc;
   done;
 done;
done

the line그러면 각 s의 마지막 5147개 행에서 발생 횟수를 계산하고 로 $file1저장합니다 $match1. 그런 다음 각 s에서 발생 횟수를 계산 하고 로 저장합니다 . 그런 다음 계산합니다.the line$file2match2file3$match3($match1 + $match2 + $match3) * 200

수행 중인 작업에 파일을 추가하고 구문을 수정하기만 하면 됩니다.

echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \ 
      $(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" | 
        awk '{print ($1+$2+$3)*200}' 

다음은 몇 가지 팁입니다. grep -c일치 항목을 인쇄하는 대신 계산하므로 필요하지 않습니다 wc. awk수학을 수행할 수 있으므로 필요하지 않습니다 bc. 나는 더 이상 셸에서 산술 연산을 수행하지 않기 때문에 echo대신 사용합니다 expr. 세 가지 검색 결과를 에코하고 에 전달하면 다음 awk과 같은 결과가 나옵니다.

echo "10 4 12" | awk '{print ($1+$2+$3)*200}' 

더 간결한 버전:

echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \ 
         $(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))

이것은 기호를 사용하여 쉘에서 모든 수학 연산을 수행합니다 $(( )). 시도해 볼 수 있습니다 echo $((2*4)). 읽기가 쉽지는 않지만 다음과 같이 확장됩니다.

echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"

답변3

여러 CSV 파일에서 행을 계산하는 비슷한 문제를 해결했습니다.

스크립트의 출력인 CSV 파일의 큰 목록이 있으므로 동일한 필드를 갖습니다. 유효한 값이 있는 행 수에 관심이 있습니다.

이 트릭을 수행하는 명령은 다음과 같습니다.

awk -F, '{if ($5>0.0) print $5}' va.2021-04-11.153123.csv va.2021-04-11.111709.csv | wc -l
  • -F,구분 기호 설정 ,(내 CSV 파일은 ,구분되어 있음)
  • '{if ($5>0.0) print $5}'awk무엇을 해야 할지 알려주는 "스크립트"입니다.
    • 5번째 필드가 0.05번째 필드보다 큰 경우
    • wc그런 다음 플래그 와 함께 파이프하여 -l출력의 행 수를 계산합니다.
  • va.2021-04-11.153123.csv va.2021-04-11.111709.csv두 개의 CSV 파일이 공백으로 구분된 목록입니다.

관련 정보