AWK

2014-03-03 9 views
0

에 루프를 추가 나는 이전 post에서 해결 된 문제가 있었다 :AWK

을하지만 너무 많은 파일을 가지고 있기 때문에 모든 파일상의 AWK을 한 후 얻을 수있는 두 번째 스크립트를 사용하는 것은 실용적이지이었다 내가 원하는 출력.

3 
10 
23 
. 
. 
. 
720 
810 
980 

그리고 스크립트가 첫 번째 파일의 번호는이 다른 파일에 빠졌다 위치를 확인하는 데 사용되었다 : 그 범위가있었습니다

2 0.004 
4 0.003 
6 0.034 
. 
. 
. 
996 0.01 
998 0.02 
1000 0.23 

여기

내 파일의 몇 가지 예입니다 두 번째 파일의 두 번째 열의 평균값이 추정되었습니다.

다음은 스크립트입니다 : 모든 파일에 대한 평균 추정되었다 있도록

awk -v start=$(head -n 1 file1) -v end=$(tail -n 1 file1) -f script file2 

BEGIN { 
     sum = 0; 
     count = 0; 
     range_start = -1; 
     range_end = -1; 
    } 
    { 
     irow = int($1) 
     ival = $2 + 0.0 
     if (irow >= start && end >= irow) { 
       if (range_start == -1) { 
        range_start = NR; 
       } 
       sum = sum + ival; 
       count++; 
      } 
     else if (irow > end) { 
       if (range_end == -1) { 
        range_end = NR - 1; 
       } 
      } 
    } 
    END { 
     print "start =", range_start, "end =", range_end, "mean =", sum/count 
    } 

가 어떻게 루프를 만들 수 있습니다. 원하는 출력은 다음과 같습니다.

Name_of_file 
start = number , end = number , mean = number 

미리 감사드립니다.

+0

GNU awk 버전 4에는 유용 ​​할 수있는'BEGINFILE'과'ENDFILE' 특수 패턴이 있습니다. 당신이해야 할 일은 인덱스 파일과 몇 개의 다른 파일들에 대한 문제를 줄이고 원하는 출력을 보여주는 것입니다 : http://stackoverflow.com/help/mcve –

답변

2

.. 루프로 감싸고 있습니까? 개인적으로

for f in <files>; do 
    echo "$f"; 
    awk -v start=$(head -n 1 "$f") -v end=$(tail -n 1 "$f") -f script file2; 
done 

내가 (한 줄에 결합 제안 그래서 그 결과 다른 라인에 파일 이름을 반대로 결과가 블록 데이터 있음 -이 경우에 추가하지에 (echo -n "$f "echo "$f" 교체 . 줄 바꿈)

편집 : 나는 당신에게 가정 구문에 익숙 있기 때문에 글로브 (file*, files/data_*.txt, 무엇이든), 또는에 의해 생성 된, <files> 파일 목록 (file1 file2 file 3), 파일의 목록이 될 수 있습니다 명령에 의해 생성 된 파일 목록 ($(find files/ -name 'data' -type f) 등)