2011-02-27 2 views
0

두 줄의 텍스트 파일이 있는데, 각각 수 백 줄이 있습니다. 일부 파일은 두 파일에 모두 존재하며 파일 중 하나에 만 존재하도록 파일을 제거하려고합니다. 기본적으로, 나는 그것들을 줄여서 독특한 라인을 얻고 싶다. 잡기는 내가 그들을 분류 할 수 없다는 것입니다 (그들은 내 Chromium 역사의 덤프를 벗겨 냈습니다).다른 파일에있는 텍스트 줄 제거

가장 쉬운 방법은 무엇입니까?

WinDiff를 시도했지만 잘못된 결과가 나타납니다. 나는 PHP 스크립트를 한꺼번에 쓸어 버릴 수 있다고 생각하지만, 쉬운 방법 (명령 줄 도구가 바람직 함)이 있기를 바라고 있습니다.

답변

0

글쎄, 필자는 결국 PHP 스크립트를 작성하게되었습니다.

두 파일을 문자열로 읽은 다음 \r\n을 구분 기호로 사용하여 배열로 문자열을 분해했습니다. 그런 다음 배열을 반복하여 존재하는 모든 요소를 ​​제거한 다음 파일로 다시 덤프했습니다.

유일한 문제는 함수에 스트립 핑 루틴을 리팩토링하려고 시도했기 때문에 변경된 (요소가 제거 된) 배열을 참조로 전달하면 Ctrl-C가 필요할 때까지 속도가 느려지는 것을 발견했습니다 그래서 가치를 넘어서서 새로운 배열을 반환했습니다 (반 직관적). 또한, unset ~ delete the elements을 사용하면 무엇을해도 속도가 느려졌 기 때문에 요소를 빈 문자열로 설정하고 덤프 중에는 생략했습니다.

0

당신이 bash 쉘 (Cygwin에서)가있는 경우, 다음과 같은 쉘 명령해서 a.txt에서 두 파일에 나타나는 모든 라인을 제거하는 것입니다 : 내가 할 수있는,

comm -12 <(sort a.txt|uniq) <(sort b.txt|uniq) | while read dupe; do dupe_escaped=$(echo "$dupe" | sed 's/[][\.*^$/]/\\&/g'); sed -e "/${dupe_escaped}/d" -i a.txt; done 
+0

내가 말했듯이 정렬되지 다음 때문에 I 따라서 URL에 대한 방문 순서를 잃어 버려 모든 상황을 잃어 버리게됩니다. 정렬이 가능하다면 ** 정말 쉬울 것입니다. – Synetech

+0

정렬은 중간의 중복 목록을 만든 다음 정렬되지 않은 파일에서 중복 된 내용을 필터링하는 데 사용됩니다. – codecraft

+0

두 파일을 하나로 병합하려면 AWK 도구를 사용할 수도 있습니다 : awk '! ($ 0) {a [$ 0]; print}'a.txt b.txt' – codecraft