선 아래 또는 위의 데이터 가져오기

선 아래 또는 위의 데이터 가져오기

이것은 내 파일입니다:

print energy 1 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol

print energy 2 end
  Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
  Global net ELEC energy = 1.682997967326E+05 kJ/mol

숫자가 필요하지만 어느 것이 나에게 적합한지 알 수 있는 유일한 방법은 선입니다 print. 지금까지 나는 이 명령을 사용하여 문제를 해결했습니다.

tail -16 file.txt | head -1 | awk '{print $6}'

하지만 이 방법은 좋지 않다고 생각합니다. 줄 번호에 의존해야 합니다. 데이터가 수천 개의 행 중간에 있으면 손실됩니다. 이에 대한 더 나은 옵션을 알고 있습니까?

답변1

포함된(추측) 각 필드 다음에 두 번째 줄의 6번째print 필드를 인쇄한다고 가정하면 다음을 사용할 수 있습니다.

awk '/print/{if (getline > 0 && getline > 0) print $6}'

또는:

awk '!--n {print $6}; /print/ {n=2}'

첫 번째 행의 마지막 필드에 Global첫 번째 항목 이후에 나타나는 필드를 포함하려면 다음을 수행하세요 print energy 1 end.

awk '/print energy 1 end/{found=1}; found && /Global/ {print $(NF-1); exit}'

게임 위 행의 데이터를 인쇄하려면 먼저 데이터를 기록한 후 플레이하면서 기록된 데이터를 인쇄해야 합니다. 예를 들어 다음을 포함하는 첫 번째 필드 앞 줄의 6번째 필드를 인쇄합니다 print.

awk '/print/{print recorded;exit};{recorded=$6}'

답변2

샘플 데이터를 바탕으로 GNU grep해결 방법은 다음과 같습니다.

$ grep -oP '(?<== ).+? ' file
1.635393034217E+05 
1.635393034217E+05 
1.682997967326E+05 
1.682997967326E+05

답변3

잘라내기를 사용할 수도 있습니다.

cut -d "=" -f2 file

"kJ/mol"이 필요하지 않으면 배관에 awk를 사용하십시오.

cut -d "=" -f2 file | awk '{print $1}'

답변4

나는 모든 print 문이 빈 줄로 구분되어 있다고 가정하고 있으며, print를 포함하는 각 문 다음에 두 번째 줄의 6번째 필드를 인쇄한다고 가정합니다.

$ cat ccc
print energy 1 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol

print energy 2 end
  Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
  Global net ELEC energy = 1.682997967326E+05 kJ/mol

Read energy 3 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol


$ awk -v RS='\n\n' '/print/{gsub (/\n/,""); {print $18}}' ccc
1.635393034217E+05
1.682997967326E+05

관련 정보