2016-07-16 2 views
1

텍스트 파일을 배열로 읽어 들이고 요소를 추출하고 정렬하는 데 시간이 오래 걸립니다.배열에서 문자열을 정렬하는 데 오랜 시간이 걸립니다.

텍스트 파일은 R128 오디오 분석을위한 ffmpeg 콘솔 출력입니다. 가장 높은 M과 S 값을 얻어야합니다. 예 : 텍스트 파일이 긴 오디오 파일의 지속 시간에 따라 라인의 수백 또는 수천 수 있습니다

[Parsed_ebur128_0 @ 0x7fd32a60caa0] t: 4.49998 M: -22.2 S: -29.9  I: -27.0 LUFS  LRA: 9.8 LU FTPK: -12.4 dBFS TPK: -9.7 dBFS 
[Parsed_ebur128_0 @ 0x7fd32a60caa0] t: 4.69998 M: -22.5 S: -28.6  I: -25.9 LUFS  LRA: 11.3 LU FTPK: -12.7 dBFS TPK: -9.7 dBFS 

내가 가장 높은 M (-22.2)와 S 값을 찾기 위해 (-28.6)를 원하는
을 분석하고 내가 현재 사용하고 어떤 변수 M 및 S

이것은에 할당 :

ARRAY=() 
while read LINE 
do 
ARRAY+=("$LINE") 
done < $tempDir/text.txt 

for LINE in "${ARRAY[@]}" 
do 
echo "$LINE" | sed -n ‘/B:/p' | sed 's/S:.*//' | sed -n -e 's/^.*M://p' | sed -n -e 's/-//p' >>/$tempDir/R128M.txt 
done 
for LINE in "${ARRAY[@]}" 
do 
echo "$LINE" | sed -n '/M:/p' | sed 's/I:.*//' | sed -n -e 's/^.*S://p' | sed -n -e 's/-//p' >>$tempDir/R128S.txt 
done 

cat $tempDir/R128M.txt 
M=($(sort $tempDir/R128M.txt)) 

cat $tempDir/R128S.txt 
S=($(sort $tempDir/R128S.txt)) 

이 일을 더 빠른 방법이 있나요?

+1

예. 하나는 보통 속도를 위해 bash 스크립트로 작성하는 것을 선택하지 않습니다. 적절한 perl 스크립트조차도 아마 여기에 상당한 속도 개선 명령을 줄 것입니다, 특히 정규 표현식 처리로 볼 때 그렇습니다. – davmac

답변

2

오히려 메모리에 전체 파일에 읽기 별도의 파일에의 비트를 쓰고, 다시 사람들을 읽는 것보다, 그냥 구문 분석하고 가장 큰 값을 선택 :

데이터에
$ awk '$7 > m || m == "" { m = $7 } $9 > s || s == "" { s = $9 } END { print m, s }' data 
-22.2 -28.6 

, 필드 7과 9는 M과 S의 값을 포함합니다. awk 스크립트는이 필드에서 더 큰 값을 찾은 다음 끝에있는 최대 값을 인쇄하면 ms 변수를 업데이트합니다. 값을 아직 읽지 않은 경우 값 초기화를 트리거하려면 m == ""s == ""이 필요합니다.

청소기 보일 수 있습니다 awk 또 다른 방법 :

$ declare $(awk 'FNR == 1 { m = $7; s = $9; next } $7 > m { m = $7 } $9 > s { s = $9 } END { printf("M=%f S=%f\n", m, s) }' data) 

$ echo $M $S 
-22.200000 -28.600000 

%s를 사용하는 대신 %f 경우 위해 printf() 형식을 조정합니다

$ awk 'FNR == 1 { m = $7; s = $9; next } $7 > m { m = $7 } $9 > s { s = $9 } END { print m, s }' data 

쉘에 MS에 할당하기 float 값 대신 원래 문자열을 원하거나 원하는 자리 수를 설정하십시오 (예 : %.2f). %f입니다.

+0

감사합니다. 이것은 완벽하게 작동했습니다. 스크립트에 할당 할 추가 정보를 입력 해 주셔서 감사합니다. – ssmc

1

우선 3 프로세스 파이프는 단일 값 추출을 위해 약간 중복됩니다. 특히 마다 행에 대해 다시 인스턴스 화해야합니다.

다음으로 모든 값을 파일에 저장 한 다음 해당 파일을 정렬하는 반면 필요한 것은 최대 값입니다. 첫 번째 (값 추출) 루프에서 I/O 오버 헤드 대신 I/O 오버 헤드 및 O(NlogN) 정렬 비용 대신에 O(N) 실행 시간을 추가로 쉽게 찾을 수 있습니다. bash 매뉴얼의 ARITHMETIC EXPANSION과 조건식을 참조하십시오.

관련 문제