![결과:](https://linux55.com/image/10533/%EA%B2%B0%EA%B3%BC%3A.png)
패턴의 시작과 끝 사이에 관심 있는 레코드(수백만 개의 레코드)가 있는 다음 파일이 있습니다. 시작 패턴은 항상 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
삭제됩니다 ( ). 다른 모든 줄의 경우 해당 줄의 예약된 공간이 추가되고( ) 두 부분은 개행 문자( ) 대신 공백으로 교체됩니다.A
Z
/^[AZ]/d
A
G
s/(.*)\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을 탭으로 뒤집고 변경합니다.