이전 줄에 공통 텍스트가 포함된 경우 이전 줄과 현재 줄을 유지하는 방법은 무엇입니까?

이전 줄에 공통 텍스트가 포함된 경우 이전 줄과 현재 줄을 유지하는 방법은 무엇입니까?

이전 줄에 공통 텍스트가 포함된 경우 이전 줄과 현재 줄을 유지하는 방법은 무엇입니까?

다음과 같은 기본 파일이 있습니다.

Hello_world
Anna
Frank
Jeremy
Hello_earth
Jessie
James

다음과 같은 3개의 출력 파일을 원합니다.

출력 파일 1(이전 hello의 문자열만)

Hello_world,Anna
Hello_earth,Jessie

출력 파일 2(문자열만 있고 이전 hello는 없음)

Frank
Jeremy
James

출력 파일 3(이전 hello가 있는 문자열만 해당되고 이전 hello 줄이 없는 문자열에는 Hi가 포함되어 있습니다)

Hello_world,Anna
Hello_earth,Jessie
Hi,Frank
Hi,Jeremy
Hi,James

grep 및 awk를 사용해 보았으나 원하는 결과를 얻을 수 없습니다.

답변1

추가 작업은 다음과 같습니다 awk.

awk -v OFS=, '
  /^Hello_/{
    getline name
    print $0, name > "file1"
    print $0, name > "file3"
    next
  }
  {
    print > "file2"
    s = s "Hi" OFS $0 ORS
  }
  END {
   printf "%s", s > "file3"
  }' < input

답변2

다음은 GNU sed 스크립트입니다. 전체 패턴 공간이 아닌 파일의 첫 번째 줄에만 추가하기 위해 특수 "W"(대문자 w) 명령을 사용합니다. 이는 "no_name" 엣지 케이스에 사용됩니다. 아래를 참조하세요.

#!/usr/bin/sed -nrf

/^Hello_/{
    :new
        $b no_name
        N
        /\nHello_/b no_name
        b first_name
        :no_name
            s:^[^\n]+:&,:
            W output_1.txt
            W output_3.txt
            s:^[^\n]+\n?::
            /./b new
            $b other_names
        :first_name
            s:\n:,:
            w output_1.txt
            w output_3.txt
}
/^Hello_/!H
${
    :other_names
        x
        s:^\n::
        w output_2.txt
        /./s:^:Hi,:mg
        w output_3.txt
}

"Hello_" 키워드 뒤에 이름이 없는 등 일부 극단적인 경우를 테스트하기 위해 샘플 입력 파일에 Hello_foo\nHello_bar. 산출:

==> output_1.txt <==
Hello_world,Anna
Hello_earth,Jessie
Hello_foo,
Hello_bar,
==> output_2.txt <==
Frank
Jeremy
James
==> output_3.txt <==
Hello_world,Anna
Hello_earth,Jessie
Hello_foo,
Hello_bar,
Hi,Frank
Hi,Jeremy
Hi,James

답변3

Gnu linux 및 freebsd에서 테스트되었습니다.

sed '
  /^Hello/!b1
  N;s/\n/,/w file1
  b
  :1
  w file2
  s/^/Hi,/;H
  $!d;x
  s/^\n//
' file >file3

file1표준 출력 과 출력 에 두 줄을 씁니다 . 패턴 공간에 한 줄을 쓰고 file2추가한 후 마지막으로 이를 stdout으로 출력하고 file3.

답변4

예상되는 출력 2와 3이 확실하지 않습니다. 아마도 다음과 같은 뜻일 것 같습니다.

$ <hello paste -d, - - | sed -n '/Hello/p'
Hello_world,Anna
Hello_earth,Jessie

$ sed '/Hello/ d' hello 
Anna
Frank
Jeremy
Jessie
James

$ (sed -n '/Hello/p' hello ;sed  '/Hello/d' hello)
Hello_world
Hello_earth
Anna
Frank
Jeremy
Jessie
James

어디:

$ cat hello 
Hello_world
Anna
Frank
Jeremy
Hello_earth
Jessie
James

관련 정보