GNU 정렬 및 자식 비난


2

오늘 나는 간단한 작업을하고 있다고 생각했습니다.

git blame file | sort -k 3

모든 행을 file마지막으로 변경된 날짜별로 정렬합니다. 불행히도 올바르게 정렬하지 않은 것 같습니다. 그것은 않습니다 나는 다음을 수행하면 작동 :

git blame file | cut -c 20- | sort

이것은 라인의 첫 부분을 해킹 한 다음 정렬합니다. 이 명령의 성공은 실제로 내가 시도한 작업을 수행 sort 할 수 있음을 나타냅니다 . 왜 작동하지 않습니까?

다음은 출력 결과의 예입니다 git blame file.

35d8e9eb (username 2007-01-17 03:58:04 +0000 155) Some text on line 155

편집 : 3원래 명령 줄 이외의 합리적인 숫자를 사용하면 잘 작동하는 것 같습니다-해시 (필드 1), 사용자 이름 (필드 2), 시간 (필드 4) 또는 행 번호 (필드 6) 그러나 날짜 (필드 3)가 작동하지 않습니다-실제로 어떤 순서로 끝나는 지 전혀 알 수 없습니다 ...

편집 2 : 동일한 문제를 보여주는 위생 처리 된 입력 파일을 만들었습니다. 여기 있습니다 cleaned.txt:

cb7bb041 (eeeeeee  2010-12-14 19:41:18 +0000  42)
35d8e9eb (cccccccc 2007-01-17 03:58:04 +0000 135)
d7377fa9 (hhhhhhhh 2010-01-30 04:26:28 +0000 178)

그리고 출력 sort -k 3 cleaned.txt:

$ sort -k 3 cleaned.txt 
cb7bb041 (eeeeeee  2010-12-14 19:41:18 +0000  42)
35d8e9eb (cccccccc 2007-01-17 03:58:04 +0000 135)
d7377fa9 (hhhhhhhh 2010-01-30 04:26:28 +0000 178)

보시다시피 날짜 필드에서 정렬이 전혀 수행되지 않은 것으로 보입니다. 출력은 다음과 같습니다 cut -c 20- cleaned.txt | sort.

$ cut -c 20- cleaned.txt | sort
2007-01-17 03:58:04 +0000 135)
2010-01-30 04:26:28 +0000 178)
2010-12-14 19:41:18 +0000  42)

이 경우 날짜를 정렬하면 잘 작동합니다! 어떤 제안?

답변:


4

방금 알아 냈어요 짧은 사용자 이름 eeeeeee은 날짜 필드 앞에 추가 공간이 있음을 의미합니다. 에 대한 필드 구분 기호 sort는 공백이 아닌 공백으로 바뀌기 때문에 사용자 이름이 짧은 줄의 날짜 필드에는 키 필드의 일부로 해당 공간이 있으며 먼저 정렬됩니다. 간단한 수정 :

git blame file | sort -b -k 3

2
또한 공백이 다른 저자 이름도주의해야합니다. 여러분의 예제는 모두 한 단어로 된 저자 이름 ( eeeeeee,, cccccccchhhhhhhh)을 갖지만 실제 이름은 종종 다를 수 있습니다 (예 : git.git은 1에서 5까지의 공백으로 구분 된 "단어"로 저자 이름이 있습니다). 사용하면 -e도움이 될 수 있습니다. 표시되는 이메일 주소는 공백이 거의 없습니다.
Chris Johnsen

@Chris-좋은 지적. 이것은 한 번만 혼란 스러웠으므로 일반적으로 걱정하지 않지만이 스크립트를 작성해야한다는 것을 기억하는 것이 좋습니다.
Carl Norum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.