이전 줄에 공통 텍스트가 포함된 경우 이전 줄과 현재 줄을 유지하는 방법은 무엇입니까?
다음과 같은 기본 파일이 있습니다.
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