파일에서 패턴 반복 감지

파일에서 패턴 반복 감지

파일이 다음 패턴을 따르는지 확인하고 싶습니다.

... ... ... foo ... foo_KO ... ... 
... bar ... ... ... ... bar_KO ...

파일이 매우 길기 때문에 즉, 다음 규칙을 보장하고 싶습니다 sed.

([az]*)_KO가 일치할 때마다 같은 줄에 \1 값을 갖는 또 다른 필드가 있게 됩니다.

나는 충분히 명확하기를 바랍니다.

저는 ksh를 사용하는 Solaris 10을 사용하고 있습니다.

예:

입력하다

... ... ... foo ... foo_KO ... ... 
... bar ... ... ... ... bar_KO ...

산출

valid

입력하다

... ... ... foo ... foo_KO ... ... 
... bar ... ... ... ... bar_KO ...
... fubar_KO ... ... ... ... ... 

산출

invalid line 3 

또는

unmatched pattern fubar_KO

답변1

그러면 잘못된 줄의 줄 번호가 인쇄됩니다.

sed -n '/\([a-z]\+\).*\1_KO/b;/\([a-z]\+\)_KO.*\1/b;=' input_file

그러나 한 줄에 여러 개의 "_KO"를 처리하지 않습니다.


이는 더욱 안정적이고 이식성이 뛰어납니다.

awk '{for(i=1;i<=NF;i++)if((s=$i)~/^([a-z]+)_KO/){sub(/_KO$/,"",s);o=0;for(j=1;j<=NF;j++)if($j==s)o=1;if(!o)printf"line %d unmatched %s\n",NR,s}}' input_file

이는 더 까다롭고 효율적이며 여러 모드를 지원하지만 순서에 따라 로캘이 성공에 영향을 미칠 수 있습니다.

ruby -nae '$F.sort!.select!{|v|v=~/^[a-z]+(_KO)?$/};$F.each_with_index{|v,k|puts"line #{$.} unmatched #{v}"if v[/^([a-z]+)_KO$/]and$F[k-1]!=$1}' input_file

기본적으로 위와 동일한 솔루션 awk이지만 덜 장황해 보입니다 perl.

perl -nae 'for$k(grep/^[a-z]+_KO$/,@F){print"line $. unmatched $k\n"unless grep{$_ eq substr$k,0,-3}@F}' input_file

답변2

신비한 Perl:

perl -ne '/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/ && print "invalid line $.: missing $1\n"' filename

/(\w+)_KO\b/"_KO" 단어를 찾아 KO가 아닌 부분을 변수에 캡처합니다. $1
!/\b$1(?!_KO)\b/_KO(단어 경계) 없이 "독립형" 단어가 없으면 \btrue 입니다.
두 조건이 모두 true이면 오류 메시지를 인쇄합니다.

파일이 "유효"한지 확인하려면 다음을 수행하십시오.

output=$(perl -ne '/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/ && print "invalid line $.: missing $!\n"' filename)
[ -z "$output" ] && echo valid

또는

perl -ne '
    BEGIN {$count = 0}
    if (/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/) {print "invalid line $.: missing $!\n"; $count++}
    END {$count == 0 && print "valid\n"}
' filename

관련 정보