awk를 사용하여 행(레코드)을 분할하는 방법은 무엇입니까?

awk를 사용하여 행(레코드)을 분할하는 방법은 무엇입니까?

파일:

data
A B
C D
data
E F
G H
data
I J
K L
M N

원하는 결과:

I J
K L
M N

"데이터"로 분할하는 방법은 무엇입니까? awk 사용 방법에 대해 Google에서 검색했지만 대부분의 상대 awk는 열을 분할합니다.

답변1

레코드 구분자로 사용 data하고 마지막 레코드를 인쇄하려면:

$ awk -v RS=data 'END{print}' File

I J
K L
M N

이를 위해서는 에 대한 다중 문자 값을 지원하는 GNU awk(gawk) 또는 mawk와 같은 awk가 필요합니다 RS.

답변2

$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N

이는 awkstring 으로 시작하는 마지막 줄 이후의 입력 내용을 가져오는 데 사용됩니다 data. 이는 해당 줄 뒤의 각 줄 섹션을 lines변수에 저장하여 수행됩니다. 로 시작하는 줄이 data나타날 때마다 이 변수는 비워집니다. 입력이 끝나면 변수의 값이 인쇄됩니다.


사용 sed:

$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N

모든 라인을 보류 공간에 추가합니다. 마지막 줄을 만나면 보류 공간이 패턴 공간으로 교체되고 나머지 비트가 인쇄되기 전에 문자열 data(양쪽에 줄바꿈 옆에 있음)까지의 모든 항목이 제거됩니다.


사용 ed:

$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N

또는,

ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED

data여기서는 먼저 줄의 시작 부분에서 마지막으로 나타나는 문자열을 역방향으로 검색하고 해당 줄에 레이블을 지정합니다(이를 label 이라고 합니다 a). 그런 다음 버퍼의 시작 부분부터 레이블이 지정된 줄까지 삭제합니다. 단순히 ,p버퍼의 전체 내용을 출력합니다.

GNU가 아닌 경우에는 (저장하지 않고 종료하는) ed최종 명령이 필요하지 않을 수도 있습니다.Q

답변3

줄 바꿈 대신 "데이터"에서 레코드를 분할하려면 RS(레코드 구분 기호) 변수를 설정하세요.

네 번째 레코드에만 관심이 있으므로(첫 번째 레코드는 첫 번째 "데이터" 앞에 있고 비어 있음) NR이 4인 경우에만 인쇄합니다.

cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'

답변4

아래 방법으로 수행했는데 제대로 작동했습니다. 명령:

tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'

산출

 I J
 K L
 M N

관련 정보