이 일반 구조의 입력 파일이 있습니다.저는 단지 산 덩어리에서 가치 단계와 가중치를 추출하고 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에 대한 질문과 답변세부 사항, 요점은 \s
GNU 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
나중에 나타나는 경우에만 작동하지만 연속된 줄이 필요하지 않습니다.