열의 중복 행 병합

열의 중복 행 병합

다음과 같은 파일이 주어지면:

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개 이상의 연속된 $i0개 이상의 공백을 찾아서 로 바꿉니다 $i+.

관련 정보