데이터가 이와 같은 파일에 있는 시나리오가 있습니다.
데이터:
1234 2271 4423
8901 1234 2569
1234 5678 9107
1134 7896 6780
출력은 다음과 같아야 합니다.
1234 2271 4423
8901 1234 2569
1134 7896 6780
전체 행을 검색해야 하는데 인접한 숫자가 반복되는 경우 전체 행을 표시합니다. "인접한" 숫자는 공백으로 구분할 수 있습니다(다른 숫자로는 구분할 수 없음).
예를 들어:
1234 2271 4423 -> in this 2271 -> [2][2] 71 -> the 2 digit is adjacently repeated.
마찬가지로 또 다른 인접한 중복이 있습니다 -> 4423 -> [4][4]23
1134 7896 6780
In this also -> [1][1]34 and 789[6] [6]780
나는 이 해결책을 얻었습니다. 누군가 그것이 정확히 무엇을 의미하는지와 다른 간단한 방법을 설명해 줄 수 있습니까? 몇 가지 아이디어를 얻을 수 있도록 올바른 설명을 공유하고 제공해 주세요.
command 1 : grep '\([0-9]\) *\1'
command 2 : grep '\([0-9]\)\s*\1'
command 3 : grep '\(\d\)\s*\1'
command 4 : grep -e '([0-9])\1' -e '([0-9]) \1'
답변1
grep
내가 올바르게 이해했다면 이것은 GNU 가능성입니다.
grep -P "([0-9])[[:blank:]]?\1" file
산출:
1234스물 둘7144이십 삼 8901 1234 2569 1134 7896 6780
답변2
역참조 및 물음표 수량자를 사용하는 것만큼 재미있지는 않지만 파이프와 간단한 정규식을 사용하여 이 작업을 수행할 수 있으며 이는 IMHO를 이해하기 더 쉽다는 장점이 있습니다.
tr -d ' ' | egrep '00|11|22|33|44|55|66|77|88|99' | sed -r 's/..../& /g'
또는 sed에서 모든 작업을 수행할 수 있지만 읽기가 어렵습니다.
sed -r 's/ //g;/00|11|22|33|44|55|66|77|88|99/!d;s/..../& /g'
이 모든 것의 기본 개념은 숫자 사이의 공백을 제거하고 간단한 정규식을 사용하여 줄을 인접한 숫자와 일치시킨 다음 공백을 다시 넣어 인쇄하는 것입니다.
답변3
다음 awk
절차가 작동합니다.
awk '{buf=gensub(/ */,"","g",$0); split(buf,chars,""); last=chars[1];
for (i=2;i<=length(buf);i++) {if (chars[i]==last) {print; next}; last=chars[i]}}' test.txt
그러면 먼저 입력 줄의 모든 공백이 제거되고 결과가 string 에 저장됩니다 buf
. 그런 다음 buf
개별 문자 배열 로 분할됩니다 chars
. 연속된 문자가 있는지 확인하기 위해 구문 분석됩니다. 그렇다면 해당 행을 인쇄하십시오.
(정규식 역참조에 의존하지 않는 솔루션은 다음과 같습니다.)