아래와 같이 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