2013-12-24 6 views
1

awk에 파이핑 중이며 일부 줄의 끝에 좋은 RS 문자열을 찾았습니다. 그러나 RS로 후행 문자열을 정의하면 awk가 전체 줄 내용을 제거합니다. 나는 RS 문자열까지 데이터를 보존하고 RS는 라인에서 제거하기를 원합니다. AWK위한awk - RS, 같은 줄 앞에 데이터를 인쇄하십시오.

예 입력 : AWK에서

data data data RS_STRING 
data SEARCHED_STRING data data 
data data 

data data data RS_STRING 
data data data 
data data 

data data data RS_STRING 
data SEARCHED_STRING data data 
data data 

원하는 출력은 :

awk '/SEARCHED_STRING/' RS = "RS_STRING" 

... 및 I 얻을 :

data data data 
data SEARCHED_STRING data data 
data data 

data data data 
data SEARCHED_STRING data data 
data data 

나의 현재 AWK 구문은

data SEARCHED_STRING data data 
data data 


data SEARCHED_STRING data data 
data data 

RS_STRING을 RS로 정의하면 알 수 있듯이 awk는 해당 행에 포함 된 RS 이전의 모든 데이터를 제거합니다.

나는 지난 3 일 동안 해결책을 찾고 있었지만 아직 찾지 못했습니다.

미리 감사드립니다. 이 기록 사이에 빈 줄이없고, RS_STRING 레코드의 첫 번째 줄에 항상 경우 레코드 분리 등의 빈 줄과 AWK를 사용

+2

에 오신 것을 환영을 제공합니다. 곧 [About] 페이지를 읽으십시오. RS는 레코드 (라인) 분리 기호입니다. 아마 당신이 좋은 필드 구분자를 찾았다 고 생각 했나요? 레코드 구분 기호를 의미하는 경우 샘플 데이터에는 단 3 개의 레코드가 있고 세 번째 레코드는 종료되지 않습니다 (첫 번째 RS STRING 앞에있는 자료, 두 개의 마커 사이의 자료 및 두 번째 마커 뒤의 자료). 사용중인 RS 문자열은 정확히 무엇입니까? 정확히 RS를 어떻게 세우고 있니? –

+0

내가 말한 문제는, 라인의 시작 부분에 있지 않은 RS를 설정하는 것입니다. 라인의 시작 부분에 RS를 설정하면 해당 라인에서 RS가 제거되고 해당 라인의 RS 이후의 데이터는 그대로 유지됩니다. 그러나 RS가 회선 내의 다른 위치에 있으면 정의 된 RS까지의 모든 것이 삭제됩니다. 그 데이터를 보존하고 싶습니다. 이 예는 내가 성취하고자하는 것을 설명하기위한 것입니다. –

+0

sed를 시도하고 RS STRING을 null로 바꿉니다. 샘플 : sed 's/RS STRING // ' – alvits

답변

1

awk 'BEGIN{RS="";FS="RS_STRING"} 
    /SEARCHED_STRING/{$1=$1;print $0 ORS}' file 

,이 시도 :

awk '/RS_STRING/{i++}{a[i]=a[i]==""?$0:a[i]RS $0} 
    END{for (j=1;j<=i;j++) if (a[j]~/SEARCHED_STRING/) print a[j]}' file 
+1

이미 BEGIN 블록을 가지고 있기 때문에'ORS = "\ n \ n"을 추가하고 print 문에서 ORS를 제거 할 수 있습니다. –

+0

@ 글렌 잭맨 왜? 이것은 작동하고,'ORS'는'ORS = "\ n \ n"'보다 7 문자 작습니다. 필요하지 않다면'BEGIN' 블록을 사용하지 말고'-v'를 저장하기 위해 표현식 뒤에 변수를 추가하십시오/awk '/ SEARCHED_STRING/{$ 1 = $ 1; print $ 0 ORS}'RS = ""FS = "RS_STRING"file' – Jotne

+0

이 awk 구문을 수정하여 ""대신 RS = "RS_STRING"이있는 방법이 있습니까? 필자는 입력 내용에 레코드 사이에 빈 줄이 없어야하므로 RS는 원하는 출력을 가지기 위해 RS_STRING을 제외하고는 아무 것도 될 수 없습니다. –

1

을 non-awk 대답

perl -00 -ne '/SEARCHED_STRING/ and do {s/RS_STRING//g; print}' 

검색 문자열을 사용하여 단락을 검색하고 t 그는 "rs"문자열입니다.

+0

감사합니다.이 솔루션을 사용하면 원하는 결과를 얻을 수 있습니다. 문법을 설명해 주시겠습니까? 나는 그것이 정확하게 기록을 분리하는 것을 관리하는 방법을 알고있다. 검색 패턴 (SEARCHED_STRING)과 RS_STRING 대체를 공백으로 만 식별 할 수 있습니다. 그러나 RS_STRING이 레코드 구분 기호임을 어떻게 알 수 있습니까? –

+0

Perl 문서에서 발견 : "특수 값 00은 펄이 단락 모드에서 파일을 slurp로 만들 것입니다 .400 이상의 값은 Perl로 하여금 파일 전체를 슬럿하도록하지만, 일반적으로이 목적을 위해 일반적으로 사용되는 값인 0777입니다. " 불행히도 나는 그것을 이해하지 못한다. –

+0

RS_STRING에 의해 레코드를 구분하기 위해 위의 솔루션을 수정하는 방법이 있습니까? 내 입력에는 반드시 레코드 사이에 빈 줄이 필요하지 않습니다. 따라서 실제 데이터에서 명령을 테스트했을 때 RS_STRING에 의해 RS가 정의 된 경우 일반적으로 제거 된 정보 비트가 포함되었습니다. 고맙습니다. –

0

그것은 나를 위해 작동 :

echo "ab RS_STRING cd" | awk '{print "NR="NR ": \""$0"\""}' RS="RS_STRING" 

출력 당신이 보는 바와 같이, 어떤 부분 문자열 "RS_STRING" 제외 벗겨되지

NR=1: "ab " 
NR=2: " cd 
" 

.. 스택 오버플로

관련 문제