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를 사용하는 방법을 검색했지만 대부분의 상대 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

awk이것은 string 으로 시작하는 마지막 줄 이후의 입력을 얻는 데 사용됩니다 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

관련 정보