파일에서 관련 데이터 선택(열 및 행별)

파일에서 관련 데이터 선택(열 및 행별)

아래와 같이 file1이 있습니다.

0 0
0 1
0 8
ST1 2 3
5 2
2 2
ST3 4 3
4 2
5 5
ST5 1 9
1 5
7 8

필수 출력 파일:

ST1 6 5 2
ST3 12 4 5
ST5 9 1 7

이 문제를 해결하는 방법? awk를 사용하고 싶습니다. 원하는 출력처럼 보이도록 이러한 줄을 처리할 수 있는 알고리즘을 작성하는 방법을 모르겠습니다.

패턴(ST)을 찾아 그 지점부터 처리를 시작하고 싶다는 생각이다.

출력 파일 구성표: ST*, 2열에 "ST"가 있는 행의 3열을 곱하고, "ST" 아래 행의 1열을 곱합니다. 단, 다음에 "ST"가 나타날 때까지만 해당됩니다.

또한 첫 번째 ST* 이전에는 아무 것도 처리하고 싶지 않습니다.

답변1

무엇이든 awk:

$ awk '/^ST/{c=1} c{ printf "%s", (c++==1? ors $1 OFS $2*$3: OFS $1); ors=ORS } 
  END{ print "" }' infile
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7

답변2

한 줄에 2개의 숫자가 있다고 가정하면 RS레코드 구분 기호( )를 "잉시":

awk '
  BEGIN{RS="ST"}
  NR>1 {print RS $1, $2*$3, $4, $6}
' file

산출:

ST1 6 5 2
ST3 12 4 5
ST5 9 1 7

참고: GNU가 필요합니다 awk.

답변3

이 pbm을 구현하는 한 가지 방법은 다음과 같습니다.

awk -v ORS= '
($1 ~ /^ST[0-9]/) && (NF > 2) {
  if (f++) print RS
  print $1, $2*$3
  next
}
f {print "", $1}
END {print RS}
' file

산출:

ST1 6 5 2
ST3 12 4 5
ST5 9 1 7

답변4

예제 입력에 표시된 것처럼 레코드당 항상 3줄이 있다고 가정하고 GNU awk를 사용하여 다중 문자 RS 및 RT를 처리합니다.

$ awk -v RS='ST([^\n]+\n){3}' '{$0=RT; print $1, $2*$3, $4, $6}' file
ST1 6 5 2
ST3 12 4 5
ST5 9 1 7

관련 정보