입력 파일에서 특정 줄 읽기

입력 파일에서 특정 줄 읽기

이 일반 구조의 입력 파일이 있습니다.저는 단지 산 덩어리에서 가치 단계와 가중치를 추출하고 awk/sed/grep을 사용하여 출력 파일에 넣고 싶습니다. 산 블록은 입력 파일에서 비슷한 방식으로 배열됩니다.

편집: 저는 MAC OSX를 사용하고 있습니다.

 configuration {
 step         5000
 dt 2.000000e+00
 }

colvar {
name d1
x  1.70882305580118e+01
v  0.00000000000000e+00
}

1.85104129628346e-02 9.71380137561312e-02 4.00538287370335e-02
1.25662994200839e-02 9.88655406140091e-02 1.41657757894898e-01

hill {
step            0
weight    1.00000000000000e-01
centers   1.23563844380284e+02
widths    1.25331413731550e+00
}
 hill {
 step          100
 weight    1.00000000000000e-01
centers   1.19065310650377e+02
widths    1.25331413731550e+00
}

다른 답변을 통해 도움을 찾을 수 있었습니다.

 sed 's/^.*weight//' diol_colvar.colvars.state > hill.txt
 sed 's/^.*step//' diol_colvar.colvars.state > hill.txt

불행히도 이것은 내가 원하는 방식으로 작동하지 않습니다.

내 출력이 다음과 같기를 원합니다.

  0     1.00000000000000e-01
  100   1.00000000000000e-01

이 문제를 해결하도록 도와주세요.

감사해요,

답변1

1) 와sed

step와 가 weight연속된 줄에 나타난다 고 가정하면 ,

$ sed -nE '/step/{N;s/.*step\s+(\S+).*\n.*weight\s+(\S+).*/\1\t\2/p}' ip.txt 
0   1.00000000000000e-01
100 1.00000000000000e-01
  • -nE기본적으로 줄을 인쇄하지 않고 확장 정규식을 사용합니다.
  • /step/줄에 다음이 포함되어 있으면 일치합니다.step
  • N다음 줄 가져오기

노트:

위의 내용은 에서 테스트되었습니다 GNU sed 4.2.2. 다음은 OS X 및 기타 버전에 도움이 될 수 있습니다. 바라보다SO에 대한 질문과 답변세부 사항, 요점은 \sGNU sed와 같은 방식으로 작동하지 않을 수 있다는 것입니다.

sed -nE '/step/{N;s/.*step[[:space:]]+([^[:space:]]+).*\n.*weight[[:space:]]+([^[:space:]]+).*/\1\t\2/p}' ip.txt

2) 와awk

$ awk 'a ~ /step/ && /weight/{print v"\t"$2} {a=$0; v=$2}' ip.txt 
0   1.00000000000000e-01
100 1.00000000000000e-01
  • {a=$0; v=$2}행과 두 번째 필드 저장
  • a ~ /step/ && /weight/step이전 줄에 다음이 포함되고 현재 줄에 다음이 포함된 경우 일치합니다.weight

hill블록이 모두 주어진 입력과 유사하다고 가정하면 세 개의 연속 라인을 일치시켜 hill블록 만 일치하도록 제한할 수 있습니다.

awk 'b ~ /hill/ && a ~ /step/ && /weight/{print v"\t"$2} {b=a; a=$0; v=$2}' ip.txt

결과를 저장하려면 > output_filename명령 끝에 추가하십시오.

인용하다:

답변2

awk를 두 번 사용하는 것이 더 쉽습니다. 먼저 hill { }청크를 추출하고 두 번째로 보폭/가중치 값을 추출합니다.

awk '/hill *{/,/}/ {print}' \
   | awk '$1 == "step" { st = $2 }; $1 == "weight" { print st "\t" $2}'

weight이 명령은 step나중에 나타나는 경우에만 작동하지만 연속된 줄이 필요하지 않습니다.

관련 정보