파일에서 특정 데이터를 추출하려면 키워드 [awk]를 사용하세요.

파일에서 특정 데이터를 추출하려면 키워드 [awk]를 사용하세요.

다음과 같은 복잡한 파일이 있습니다.

configuration {
  step        58000
  dt 2.00000000000000e+00
}

colvar {
  name r
      x  1.44869849559022e+01
}

0.00000000000000e+00 0.00000000000000e+00 0.00000000000000e+00
0.00000000000000e+00 0.00000000000000e+00 0.00000000000000e+00

hill {
  step         1440
  weight    1.00000000000000e-01
  centers   1.47455750990065e+01 -1.69229380745887e+02
  widths    1.25331413731550e+00  1.25331413731550e+00
}
hill {
  step         1560
  weight    1.00000000000000e-01
  centers   1.47435719215456e+01 -1.70289673373179e+02
  widths    1.25331413731550e+00  1.25331413731550e+00
}
hill {
  step         1680
  weight    1.00000000000000e-01
  centers   1.47427376221419e+01 -1.68774767870364e+02
  widths    1.25331413731550e+00  1.25331413731550e+00
}  

이 파일에서 보폭, 무게 및 너비를 추출하여 탭 구분을 사용하여 새 출력 파일에 쓰는 데 관심이 있습니다. 이와 같이:-

#!step   width1                    width2             weight
1440   1.25331413731550e+00  1.25331413731550e+00   1.00000000000000e-01

나는 다음과 같이 작성된 단계와 무게를 가지고 있습니다.

awk ' b ~ /hill/ && a ~ /step/ && /weight/ {print v"\t"$2}{b=a;  a=$0; v=$2}' input > output

너비를 쓰도록 확장하려면 어떻게 해야 합니까?

답변1

getline 함수를 사용하여 다음 줄을 읽을 수 있습니다.

$ awk -vOFS='\t' '/^hill {/{ 
    getline; st=$2
    getline; we=$2
    getline; getline; wd1=$2; wd2=$3
    print st, we, wd1, wd2
}' file
1440    1.00000000000000e-01    1.25331413731550e+00    1.25331413731550e+00
1560    1.00000000000000e-01    1.25331413731550e+00    1.25331413731550e+00
1680    1.00000000000000e-01    1.25331413731550e+00    1.25331413731550e+00

답변2

명확성을 위해 다음 솔루션이 확장되었습니다.

 awk '/hill/   { delete data }
      /step/   { data["step"] = $2 }
      /weight/ { data["weight"] = $2 }
      /widths/ { data["widths"] = $2 "\t" $3;
                 print data["step"] "\t" data["weight"] "\t" data["widths"]; }' input

답변3

입력 파일을 구문 분석하려면 다음 명령줄을 사용하세요.

echo -e "step\twidth1\t\t\twidth2\t\t\tweight" && grep -A4 ^hill widwei.txt | grep "step\|weight\|widths" | awk '{$1=""; print $0}' | awk 'NR%3{printf $0"";next;}1' |  awk ' { t = $3; $3 = $2; $2 = t; print; } ' | awk ' { t = $4; $4 = $3; $3 = t; print; } '  | sed -e 's/^ //g' | sed -e 's/ /\t/g'
  1. 제목 인쇄
  2. 다음 4개 노선을 타고 산악 구간으로 가세요.
  3. 걸음 수, 무게, 너비 값을 가져옵니다.
  4. 한 줄에 인쇄하십시오.
  5. 원하는 형식을 얻으려면 열을 바꾸십시오.
  6. 나머지 선행 공백을 제거하고 탭으로 구분합니다.

답변4

awk -v RS="hill {"    'NF==11 {$1=$3=$5=$8=$11=""; print }' file

(gnu awk 사용; 적응하기 쉽지만 이 솔루션은 형식 변경에 강력하지 않습니다)

  • -v RS="hill {" 새 레코드 구분 기호(RS) 정의(기본적으로 줄, 이제 "산" 단락)
  • NF==11 ...레코드에 11개의 필드가 있는 경우
  • $1=$3=$5=$8=$11="";...텍스트 삭제
  • print...그리고 알림을 인쇄하세요

관련 정보