![열의 중복 행 병합](https://linux55.com/image/80360/%EC%97%B4%EC%9D%98%20%EC%A4%91%EB%B3%B5%20%ED%96%89%20%EB%B3%91%ED%95%A9.png)
다음과 같은 파일이 주어지면:
x y y z x
x x y z z y
x x x z y
y z z y x x x
x x x x x
나는 출력을 다음과 같이 원한다:
x y+ z x
x+ y z+ y
x+ z y
y z+ y x+
x+
awk나 Perl을 사용하여 이 작업을 수행할 수 있습니까? 즉, 연속해서 비슷한 값을 얼마든지 찾아 병합할 수 있나요?
답변1
sed 's/\(.\)\( \1\)\{1,\}/\1+/g' <in >out
x y+ z x
x+ y z+ y
x+ z y
y z+ y x+
x+
BSD 또는 GNU 사용 sed
:
sed -Ee's/(.)( \1)+/\1+/g' <in >out
임의의 필드 길이를 사용하려면 간단히 임의의 필드 길이를 사용하면 됩니다.
sed -Ee 's/(...)( \1)+/\1+/g' <<""
xxx yyy yyy zzz xxx
xxx xxx yyy zzz zzz yyy
xxx xxx xxx zzz yyy
yyy zzz zzz yyy xxx xxx xxx
xxx xxx xxx xxx xxx
xxx yyy+ zzz xxx
xxx+ yyy zzz+ yyy
xxx+ zzz yyy
yyy zzz+ yyy xxx+
xxx+
또는 두 번째 줄에서 @terdon의 입력을 약간 수정합니다.
sed -Ee's/(([^ ]+ *)+)( +\1)+/<\1>+/g' <<""
foo foo foo bar foo
bar foo bar foo
foo foo x x x bar
<foo>+ bar foo
<bar foo>+
<foo>+ <x>+ bar
답변2
이 perl
버전은 단일 문자의 필드 길이뿐만 아니라 임의의 필드 길이도 처리할 수 있습니다.
$ perl -lpae 'for $i (@F){s/($i\s*){2,}/$i+ /g}' file
x y+ z x
x+ y z+ y
x+ z y
y z+ y x+
x+
더 복잡한 파일의 경우:
$ cat file
foo foo foo bar foo
bar foo bar bar foo
foo foo x x x bar
$ perl -lpae 'for $i (@F){s/($i\s*){2,}/$i+ /g}' file
foo+ bar foo
bar foo bar+ foo
foo+ x+ bar
설명하다
-l
각 입력 줄의 개행을 자르고 , -a
공백의 입력 필드를 배열로 분할하고 @F
, -p
주어진 스크립트를 적용한 후 각 입력 줄을 인쇄합니다 -e
.
스크립트 자체는 각 입력 필드(배열 @F
)를 반복하며 각 필드를 $i
.replace로 저장하면 2개 이상의 연속된 $i
0개 이상의 공백을 찾아서 로 바꿉니다 $i+
.