이걸 어떻게 표현해야 할지 고민이 많아서 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
현재 저장된 값과 다른 경우 빈 줄을 인쇄합니다. last
awk는 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
작동합니다 . 첫 번째 필드입니다 . 각 호출에 개행 문자를 추가하여 빈 줄만 인쇄됩니다. 주어진 스크립트를 적용한 후 각 입력 줄을 인쇄하도록 합니다. 스크립트 자체는 위의 스크립트와 완전히 동일합니다.perl
awk
@F
$F[0]
-l
perl
print
print ""
-p
-e
awk
답변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
이 방법은 각 삽입을 테스트하고 다음 반복에 더해 이전 반복 결과를 안정적으로 평가하는 것을 매우 간단하게 만들지 않습니다.D
t
t
따라서 그의 답변 중 하나를 찬성 투표해 주세요. 왜냐하면 그가 여기에 넣지 않을 것이기 때문입니다.
G
et 명령은 sed
삽입된 줄바꿈 구분 기호 뒤의 패턴 공간에 예약된 공간을 추가합니다. \n
하지만 여기서는 예약된 공간이 전혀 사용되지 않으므로 남은 것은 ewline G
뿐입니다 \n
.
ext 명령은 패턴 공간에 삽입된 줄바꿈 구분 기호 뒤에 ext 입력 행을 N
추가합니다 . 각 입력 라인에 대해 et와 ext를 실행하면 각 입력 라인에 대해 두 개의 ewline이 생성됩니다 .N
\n
G
N
\n