2016-12-13 5 views
2

QM 계산의 결과 인 .log의 일부 출력 파일 (5000 파일)이 있습니다. 각 파일의 내부에서 두 가지 특별한 선 아래 예제로이 같은 전자와 궤도의 수는 (출력 파일에서와 같이 정확한 공백)가 나타냅니다 있습니다 : 나는 스크립트 (bash는 또는 포트란)에 대해 생각정수 값을 찾고이를 비교하여 주 파일을 전송하는 방법은 무엇입니까?

Number of electrons    =  9 
    Number of orbitals    =  13 

, 이 두 줄을 동시에 grep하고 해당하는 정수 값 (예 : 9 및 13)을 얻은 다음이 값을 비교하여 두 값의 차이를 찾은 다음이 문제를 해결하기위한 솔루션으로 텍스트 파일을 해당 파일 이름으로 대체합니다. 나는 주어진 도움에 정말로 감사 할 것입니다.

+0

하나 개의 인스턴스에 awk 문을 변경 전체에 존재하는 파일? – Inian

+2

@Amir 지금까지 해보신 것은 무엇입니까? 이는 상대적으로 간단한 'awk'문제입니다. 아무 것도 시도하지 않고 묻지 말고 몇 가지 문서 또는 온라인 자습서를 살펴보십시오. – VM17

+1

시작하려면 awk -F = '/^Number/{print $ 2}'file'을 실행하면 빼기를 원하는 값을 얻을 수 있습니다. 그런 다음 변수를 저장하고 빼기를 수행하거나 awk 자체에서 차이를 만들 수 있습니다. 그런 다음 출력 파일로 리디렉션됩니다. – VM17

답변

1

GNU Awk에 시도를 게시하고 테스트 한 적이 있습니다.

#!/bin/bash 

for file in *.log 
do 
    awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}' "$file" | awk 'function abs(v) {return v < 0 ? -v : v} {print abs($1-$2)}' >> output_"$file" 
done 

내가 두에 AWK 로직을 분리하는 이유는 하나의 거대한 명령에 그 일에 복잡성을 줄일 수 있었다. 첫 번째 부분은 로그 파일에서 열 형식으로 숫자를 추출하고 둘째는 절대 값을 얻기위한 것입니다.

나는 브레이크 다운됩니다 AWK 논리를 : -

  • -F'=[[:blank:]]*'[[:blank:]] 공백 문자의 = 하나 이상의 인스턴스를 포함 mult0 자 분리 논리이다.
  • '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}'Number of으로 시작하는 줄을 검색하고 샘플 파일에서 9 13과 같이 기둥 형식으로 인쇄합니다.

  • 두 번째 부분은 자체 설명입니다. 필자는 두 반환 값에서 절대 값을 가져 와서 인쇄하는 함수를 작성했습니다.

  • 각 출력은 더 처리하기 위해 output_ 파일에 저장됩니다.

명령 줄에서 bash script.sh으로 스크립트를 실행하십시오. 여기서 script.sh은 위의 행을 포함하는 이름입니다.

는 업데이트 : -

은 너무 즉 절대 기능이없는 음의 값에 관심이 있다면 경우에,이 두 라인의

awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}' "$file" | awk '{print ($1-$2)}' >> output_"$file" 
+0

친절한 도움을 주신 Inian에게 감사드립니다! 코드가 완벽하게 작동합니다. 그러나 또 하나의 질문이 있습니다. 두 값의 뺄셈의 절대 값 (음수 값도 중요 함)을 원하지 않는 경우 코드에 어떤 변경 사항을 적용해야합니까? – Amir

+0

@Amir : 내 업데이트를 참조하십시오! – Inian

+0

그것은 당신의 종류 일 것입니다, 미리 감사드립니다! – Amir

0

나쁜 방법은 그것을 할 수 있습니다 (하지만 작동합니다) -

while read file 
do 
    first=$(awk -F= '/^Number/ {print $2}' "$file" | head -1) 
    second=$(awk -F= '/^Number/ {print $2}' "$file" | tail -1) 

    if [ "$first" -gt "$second" ] 
    then 
     echo $(("$first" - "$second")) 
    else 
     echo $(("$second" - "$first")) 
    fi > "$file"_answer ; 
done < list_of_files 

이 방법은 awk 하나 라이너 (값을 집어 들고 그들을 비교

그런 다음 당신에게 줄을 뺍니다. 이 이름에 접미사로 '_answer'와 "$ 파일"_answer. 즉, 초기 파일 이름을 입력합니다. 당신은 정확하게 당신의 목적에 맞게이 코드를 조정할 필요가 있습니다

라는 파일에 저장 한 값.

+0

Varun M 씨를 친절하게 도와 주셔서 감사합니다! 불행히도이 코드는 제게 적합하지 않았지만 도움을 주셔서 감사합니다. IF 문을 제거하고 줄을 유지하기 위해 그것을 변경하려고했습니다. echo $ (("$ first"- "$ second")), 다시는 작동하지 않았습니다. 하지만 다시 한번 고마워요! – Amir