특정 삭제 목적을 위한 완전한 sort -u 옵션 명령

특정 삭제 목적을 위한 완전한 sort -u 옵션 명령

특정 삭제 목적을 위한 전체 옵션 명령 구문 100% 정확하지 않은 중복 행을 삭제하는 방법 sort -u행에서 정확한 문자를 찾는 대신 각 단어 사이에 공백이 있는 행의 길이가 다를 수 있으므로 중복 행으로 간주됩니다. 삭제됐나요?

답변1

perl -ae 'print unless $seen{"@F"}++' < file

공백으로 연결된 필드가 이전에 본 경우 F( @Fwk 모드에서) 한 줄이 인쇄되지 않습니다. 출력도 정렬하려면 a다음으로 파이프하세요.sort

이 경우 필드는 ASCII 공백 문자(공백, 가로 탭, 줄 바꿈, 캐리지 리턴, 폼 피드 및 5.18부터 세로 탭, isspace()C 로케일의 POSIX 일치와 동일)로 구분됩니다.


¹ 큰따옴표 안의 요소는 기본적으로 공백인 @list특수 변수의 값을 사용하여 연결 됩니다 .$""@F"join(" ", @F)

답변2

sort그 자체로는 원하는 대로 되지 않습니다. 귀하의 사양은 약간 모호하지만 일반적인 접근 방식은 입력을 정규화(예: 각 줄의 끝과 시작에 있는 모든 공백 제거, 여러 연속 공백을 단일 공백으로 대체 사용 tr --squeeze-repeats ' ' ' ')한 다음 결과를 정렬하는 것입니다.

일반적인 파이핑 작업을 통해 이 작업을 쉽게 수행할 수 있습니다. 이 모든 것을 단일 sed명령으로 결합할 수 있지만 데이터를 적용할 때(컴퓨터 용어로) 그렇게 크지 않다고 가정합니다 sort.

input_command | sed 's/^ *//' | sed 's/ *$//' | tr --squeeze-repeats ' ' ' ' | sort -u

얻는 출력이 반드시 실제 입력 행과 일치하는 것은 아닙니다. 예를 들어 다음과 같습니다.

 d c b a
a  b c d
a b  c d

는 입력이고 출력은 다음과 같습니다.

a b c d
d c b a

두 줄 모두 존재하지 않습니다정확히 입력에는 있지만 입력의 행과 동일한 동등 클래스의 대표입니다.

실제 입력 줄을 재현해야 하는 경우 쉘 프로그래밍에는 Python의 코드 4줄 중 절반이 필요할 수도 있고, 연관 배열이 있는 다른 언어( dictPython의 경우)가 필요할 수도 있습니다.

사실 Python은 dict반복 순서를 지정할 수 없기 때문에 여기서는 우아한 선택이 아닙니다. Python 3.7+에서는 삽입 순서를 보장하는데 이는 dict사용하기 너무 편리합니다.

std::set<std::string, [](const auto &a , const auto& b){ return normalize(a) > normalize(b); }> unique_lines;자신만의 표준화된 기능을 갖춘 C++ 유형이 normalize더 좋을 것입니다.

std::set<std::string,
         [](const auto &a, const auto &b) {
           return normalize(a) > normalize(b);
         }>
    lineset;
std::ifstream in_file("yourinputfile.txt");
std::copy(std::istream_iterator<std::string>(in_file),
          std::istream_iterator<std::string>(),
          std::inserter(lineset, lineset.end()));
for (const auto &unified_line : lineset)
  std::cout << std::format("{}\n", unified_line);

관련 정보