문서:
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