특정 삭제 목적을 위한 전체 옵션 명령 구문 100% 정확하지 않은 중복 행을 삭제하는 방법 sort -u
행에서 정확한 문자를 찾는 대신 각 단어 사이에 공백이 있는 행의 길이가 다를 수 있으므로 중복 행으로 간주됩니다. 삭제됐나요?
답변1
perl -ae 'print unless $seen{"@F"}++' < file
공백으로 연결된 필드가 이전에 본 경우 F
( @F
wk 모드에서) 한 줄이 인쇄되지 않습니다. 출력도 정렬하려면 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줄 중 절반이 필요할 수도 있고, 연관 배열이 있는 다른 언어( dict
Python의 경우)가 필요할 수도 있습니다.
사실 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);