%EC%9D%84%20%EB%B6%84%ED%95%A0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20.png)
파일:
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
이는 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