결과:

결과:

패턴의 시작과 끝 사이에 관심 있는 레코드(수백만 개의 레코드)가 있는 다음 파일이 있습니다. 시작 패턴은 항상 A로 시작하고 끝 패턴은 항상 Z로 시작합니다.

Apattern1   somethinghere    #start of pattern always starts with A
Line-of-data-here-aaa
Line-of-data-here-xxxxx
Zpattern1  #end of pattern always starts with Z
ApatternX   somethinghere    #Repeat: start of pattern always starts with A
Line-of-data-here-bbbb
Line-of-data-here-yyyy
Line-of-data-here-nnnnn
ZpatternX

패턴 내의 행에 시작 패턴(전체 행)을 추가하여 데이터를 변환하려고 합니다. 끝 패턴을 제거하고 싶습니다. 우리는 sed 및/또는 awk를 사용하여 패턴의 시작 부분(A로 시작)에 있는 줄을 패턴 내의 줄(L로 시작)에 추가하고 패턴의 끝(항상 Z로 시작)을 제거하려고 합니다. 데이터 파일은 다음과 같습니다:

Apattern1   somethinghere  Line-of-data-here-aaa
Apattern1   somethinghere   Line-of-data-here-xxxxx
ApatternX   somethinghere   Line-of-data-here-bbbb
ApatternX   somethinghere  Line-of-data-here-yyyy
ApatternX   somethinghere  Line-of-data-here-nnnnn

답변1

귀하의 질문을 이해하는 한, 귀하가 요구하는 내용은 다음과 같습니다.

sed -E '/^A/h;/^[AZ]/d;G;s/(.*)\n(.*)/\2 \1/' yourfile

따라서 or로 시작하는 줄은 A예약된 공간( )에 복사되고 or로 시작하는 줄은 인쇄할 필요가 없기 때문에 /^A/h삭제됩니다 ( ). 다른 모든 줄의 경우 해당 줄의 예약된 공간이 추가되고( ) 두 부분은 개행 문자( ) 대신 공백으로 교체됩니다.AZ/^[AZ]/dAGs/(.*)\n(.*)/\2 \1/

sed(내 자신의 확장이 더 쉽습니다. \h교체 시 버퍼의 내용을 유지하기 위해 확장하는 것입니다.

sed -E '/^A/h;/^[AZ]/d;G;s/^/\h /' yourfile

이와 같은 문제가 더 발생하면 병합 요청을 제출하겠습니다. )

답변2

sed -e '
   /^A/,/^Z/!d
   //{h;d;}
   G;s/\(.*\)\n\(.*\)/\2\t\1/
' yourfile

결과:

Apattern1   somethinghere       Line-of-data-here-aaa
Apattern1   somethinghere       Line-of-data-here-xxxxx
ApatternX   somethinghere       Line-of-data-here-bbbb
ApatternX   somethinghere       Line-of-data-here-yyyy
ApatternX   somethinghere       Line-of-data-here-nnnnn

설명하다

  • 잘못된 범위를 거부하여 올바른 범위를 선택하세요: '/^A/,/^Z/!d'
  • 예약된 공간에 범위 경계를 저장합니다.
  • 범위 내에서 현재 줄에 keep을 추가하고 \n을 탭으로 뒤집고 변경합니다.

관련 정보