하위 그룹을 생성하기 위해 테이블에 줄바꿈을 추가하는 방법이 있습니까?

하위 그룹을 생성하기 위해 테이블에 줄바꿈을 추가하는 방법이 있습니까?

이걸 어떻게 표현해야 할지 고민이 많아서 Google-fu는 실패합니다.

데이터 테이블이 포함된 텍스트 파일이 있습니다. 하위 그룹을 시각적으로 구분하기 위해 줄 바꿈을 삽입하고 싶습니다.

예를 들어, 다음과 같이 시작한다면:

jan   ford
jan   trillian
mar   trillian
sep   marvin

첫 번째 필드는 내 하위 그룹 필드이므로 출력은 다음과 같습니다.

jan   ford
jan   trillian

mar   trillian

sep   marvin

같은 달의 두 줄을 식별하는 것과 같은 작업을 수행할 수 있지만 ^(a-z){3}\t(.*)\n\1\t(.*)$서로 다른 경우 어떻게 일치시켜야 할지 모르겠습니다.

이상적으로는 이것이 BBedit에 포함될 수 있는 정규식이기를 원하지만 다른 솔루션도 열려 있습니다.

답변1

bbedit일종의 유료 OSX 편집기 처럼 보입니다 . 한번도 사용해본 적이 없고 설치도 할 수 없어서 도움을 드릴 수가 없습니다. 표시한 정규식을 기반으로 자체 정규식 구문이 있으므로 이를 사용하는 일반 *nix 사이트에서 솔루션을 찾을 가능성은 거의 없습니다. 그러나 여기에는 다른 옵션이 있습니다. 두 경우 모두 첫 번째 필드를 저장하고 이전 줄에서 본 것과 다른 경우 빈 줄을 인쇄하는 것이 좋습니다.

$ awk '{if($1!=last && NR>1){print ""}last=$1;}1;' file
jan ford
jan trillian

mar trillian

sep marvin

awk필드 기반 데이터를 처리하도록 설계된 스크립팅 언어입니다. 자동으로 각 행을 필드로 분할한 다음 $1, $2... 라고 호출할 수 있습니다 $N. 따라서 위 스크립트는 변수의 첫 번째 필드를 저장 last하고 첫 번째 줄을 제외한 모든 줄(즉, 이것이 의미하는 바)에 대해 NR>1현재 저장된 값과 다른 경우 빈 줄을 인쇄합니다. lastawk는 1;"각 줄 인쇄"의 약자입니다.

또는 다음에서 이 작업을 수행할 수 있습니다 perl.

$ perl -lape '$F[0] ne $last && $.>1 && print ""; $last=$F[0]' file
jan ford
jan trillian

mar trillian

sep marvin

여기서는 perl명령줄 스위치를 사용하여 대부분의 작업을 수행합니다. make는 각 입력 라인을 배열로 분할하는 것과 유사하게 -a작동합니다 . 첫 번째 필드입니다 . 각 호출에 개행 문자를 추가하여 빈 줄만 인쇄됩니다. 주어진 스크립트를 적용한 후 각 입력 줄을 인쇄하도록 합니다. 스크립트 자체는 위의 스크립트와 완전히 동일합니다.perlawk@F$F[0]-lperlprintprint ""-p-eawk

답변2

awk 'NR > 1 && $1 != last {print ""}; {print; last = $1}'

답변3

중계기를 일치시킬 수 있으므로 동작을 무효화하고 싶을 것입니다. 다음을 수행할 수 있습니다.

sed -e'/^\n/!{$n;G;N;s/^\(\(...\).*\)\n\2/\1\2/;}' -eP\;D <in >out

즉, 두 배 간격의 파일로 시작하고 그룹 사이의 두 번째 공백을 제거하십시오.

예제 입력 인쇄에 대해 다음 명령을 실행하십시오.

jan   ford
jan   trillian

mar   trillian

sep   marvin

이는 실제로 여러분에게 질문을 던지게 합니다. 저는 Trillian이 평행 우주에서 두 번의 생일을 가질 수 있다는 것을 알고 있다고 생각합니다. 하지만 Marvin이 생일을 가질 수 있다고 생각하는 이유를 설명해 주실 수 있나요? 그래도 9월이 더 적합할 것 같아요. 항상 우울해요.


여기 또 다른 것이 있습니다. @don_crissti 제공(약간 수정된 경우):

sed -etD -e'$q;N;/^\(...\).*\n\1/!s/\n/&&/;:D' -eP\;D

나는 그를 더 좋아한다. 그는 처음에 나에게 이렇게 물었습니다.단순히 편집하는 대신 개행 문자를 편집하는 이유는 무엇입니까?나는 실제로 어떤 대답도 갖고 있지 않으며, 그것이 큰 변화를 가져올 것이라고 생각하지 않기 때문에 대부분 양면적입니다.

그러나 문제는 여기에 사용된 예측 기술에는 칼날 버퍼가 필요하다는 것입니다. 버퍼가 한 번에 현재 두 개의 입력 라인보다 커지면 잘못된 긍정을 보고할 수 있습니다. 일치하는 동일한 스트림에 줄바꿈을 실제로 삽입하고 삽입된 입력 줄이나 삽입해야 하는 줄을 쉽게 구별할 수 있어야 하는 경우 단일 줄 미리보기의 균형을 맞추는 것은 읽기가 더 어려워집니다. 이 균형에는 다음이 필요합니다.적어도/^\n/!주기당 하나의 추가 테스트 - 위 테스트를 통과했습니다 .

그러나 sed메커니즘의 매우 기본적인 부분은 성공 시 조건부 분기를 수행하는 s///대체 문의 예상 반환입니다. t그의 교체는 항상 추가 라인을 생성하기 때문에 패턴 공간이 제거되고 est가 여전히 스크립트 상단에서 작동할 때 sed라인 루프(est의 반환을 지우는 것 )가 뒤집히지 않습니다. t이 방법은 각 삽입을 테스트하고 다음 반복에 더해 이전 반복 결과를 안정적으로 평가하는 것을 매우 간단하게 만들지 않습니다.Dtt

따라서 그의 답변 중 하나를 찬성 투표해 주세요. 왜냐하면 그가 여기에 넣지 않을 것이기 때문입니다.


Get 명령은 sed삽입된 줄바꿈 구분 기호 뒤의 패턴 공간에 예약된 공간을 추가합니다. \n하지만 여기서는 예약된 공간이 전혀 사용되지 않으므로 남은 것은 ewline G뿐입니다 \n.

ext 명령은 패턴 공간에 삽입된 줄바꿈 구분 기호 뒤에 ext 입력 행을 N추가합니다 . 각 입력 라인에 대해 et와 ext를 실행하면 각 입력 라인에 대해 두 개의 ewline이 생성됩니다 .N\nGN\n

관련 정보