패턴과 일치하는 가장 높은 번호의 행을 유지하는 방법은 무엇입니까?

패턴과 일치하는 가장 높은 번호의 행을 유지하는 방법은 무엇입니까?

예를 들어, 내 파일이 다음과 같다면:

string
string1
string2
string4
string800
value2
value3
value5
value10
something18
something20   

내가 원하는 출력은

string800 
value10
something20

숫자 앞의 단어는 무엇이든 될 수 있지만 "패턴이 일치하는 위치"라고 말하면 동일한 가장 높은 숫자를 가진 숫자 앞에 단어를 유지하고 싶다는 뜻입니다. 예를 들어 800은 10과 20보다 높지만 이전 단어가 800 이전이 아닌 경우에도 위의 예와 같이 10과 20을 포함하는 숫자를 유지하고 싶습니다.

OSX에서 작동하려면 이것이 필요하므로 GNU 유틸리티에만 존재하는 기능을 피하십시오.

답변1

나는 이것을 시도할 osx가 없지만 awk내 Linux gnu awk에서 작동합니다.

awk '
{ n = match($0, /[0-9]+ *$/);
  if(n){
    word = substr($0, 1, n - 1); num = 0 + substr($0, n);
    if(!(word in max) || max[word] < num) max[word] = num
  }
}
END{ for(word in max)print word max[word] } '

각 줄에서 정규식 패턴의 줄에서 시작 인덱스를 찾습니다. 이 인덱스는 선택적 후행 공백이 있는 숫자입니다. 해당 인덱스의 줄을 단어 부분과 숫자 부분으로 나눕니다. 숫자형 문자열에 0을 더하여 숫자로 변환합니다. 단어로 색인된 연관 배열은 가장 큰 숫자를 보유합니다.

답변2

주어진 접두사에 해당하는 행이 항상 그룹화되어 있는 경우(예: 모든 행이 stringNNN함께 있는 등) awk를 사용하고 동일한 접두사가 있는 행을 버퍼링한 다음 가장 높은 접미사가 있는 행을 인쇄할 수 있습니다.

awk '{
    match($0, /[0-9]*/);
    current_prefix = substr($0, 1, RSTART);
    current_number = substr($0, RSTART, RLENGTH);
    if (current_prefix == previous_prefix) {
        if (current_number > max_number) max_number = current_number;
    } else {
        if (NR != 1) print previous_prefix max_number;
        previous_prefix = current_prefix;
        max_number = current_number;
    }
}
END { if (NR != 1) print previous_prefix max_number; }'

주어진 접두사에 해당하는 줄이 항상 그룹화되어 있지 않은 경우(예: foo1 bar1 foo2) 먼저 파일을 정렬할 수 있습니다.

관련 정보