prova.txt
다음과 같은 파일이 있습니다.
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
extra1
extra2
bla
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
extra2
bla
bla
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
"여기서 긁기 시작"에서 첫 번째 빈 줄로 이동해야 합니다. 출력은 다음과 같아야 합니다.
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
보시다시피 "여기에서 크롤링 시작" 이후의 행은 무작위이므로 -A -B grep 플래그가 작동하지 않습니다.
cat prova.txt | grep "Start to grab from here" -A 15 | grep -B 15 "^$" > output.txt
빈 행이 나타날 때까지 크롤링될 첫 번째 행(예: "여기에서 스크래핑 시작")을 캡처하는 방법을 찾는 데 도움을 주실 수 있나요? "여기서 긁기 시작" 후에 얼마나 많은 임의의 줄이 생길지 예측할 수 없습니다.
모든 UNIX 호환 솔루션이 높이 평가됩니다(grep, sed, awk가 Perl 또는 유사한 솔루션보다 낫습니다).
편집: @john1024의 훌륭한 반응 이후에 다음을 수행할 수 있는지 궁금했습니다.
1° 청크 정렬(여기서 가져온 내용에 따라: 1, 1, 2)
2° 4개(무작위 알파벳순) 줄 삭제 fix1,fix2,fix3,fix4 단, 항상 4개
3° 마지막으로 무작위 중복을 제거합니다(예: sort -u 명령).
최종 출력은 다음과 같아야 합니다.
# fix lines removed - match 1 first time
Start to grab from here: 1
random1
random2
random3
random4
#fix lines removed - match 1 second time
Start to grab from here: 1
#random1 removed cause is a dupe
random22131
#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561
또는
# fix lines removed - match 1 first time and the second too
Start to grab from here: 1
random1
random2
random3
random4
#random1 removed cause is a dupe
random22131
#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561
두 번째 출력이 첫 번째 출력보다 더 좋습니다. 몇 가지 추가적인 Unix 명령 마법이 필요합니다.
답변1
awk를 사용하세요
노력하다:
$ awk '/Start to grab/,/^$/' prova.txt
Start to grab from here: 1
random1
random2
random3
random4
Start to grab from here: 2
random1546
random2561
Start to grab from here: 3
random45
random22131
/Start to grab/,/^$/
범위를 정의합니다. 일치하는 줄로 시작하고 Start to grab
첫 번째 후속 빈 줄로 끝납니다.^$
sed 사용
매우 유사한 논리를 사용합니다.
$ sed -n '/Start to grab/,/^$/p' prova.txt
Start to grab from here: 1
random1
random2
random3
random4
Start to grab from here: 2
random1546
random2561
Start to grab from here: 3
random45
random22131
-n
명시적으로 요청하지 않는 한 아무것도 인쇄하지 말라고 sed에 지시합니다. /Start to grab/,/^$/p
로 정의된 범위 내의 모든 행을 인쇄하도록 지시합니다 /Start to grab/,/^$/
.
답변2
누군가의 사용 사례에 유용할 수 있으므로 대체 솔루션을 게시하고 있습니다. 이 솔루션은 명시된 요구 사항을 충족하지 않습니다. 최상의 솔루션은 @John1024의 답변을 참조하세요.
awk를 사용하여 레코드 구분 기호를 빈 문자열로 설정할 수 있으며 awk는 이를 공백 줄 바꿈으로 해석합니다.
$ awk '/Start/' RS= prova.txt
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
이 버전은 출력 시 공백 개행을 유지하지 않습니다. 또한 사전 일치 컨텍스트가 있는 경우 표시됩니다. 이 동작은 grep이 파일에서 무언가를 찾고 있고 그것이 속한 개행으로 구분된 블록을 보고자 할 때 유용합니다. 예를 들면 다음과 같습니다.
$ awk '/random1546/' RS= prova.txt
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
ini
예를 들어 파일에서 콘텐츠를 찾을 때 이것이 유용하다는 것을 알았습니다 .