마지막 문자 기준으로 정렬

마지막 문자 기준으로 정렬

파일을 기준으로 정렬하고 싶습니다.

  • 텍스트앞으로첫 번째 쉼표, 그리고
  • YYYYMMMDD예제 입력의 날짜를 기준으로 보조 정렬을 수행하고 싶습니다.

입력 예:

AX,NO,NO,\PathAX/subj/defn/some-file-name-20151229.txt,
CXX,NO,NO,\PathCXX/subj/defn/some-file-name-20151229.txt,
CXX,YES,YES,\Path/subj/defn/some-file-20140503.txt,6
DY,YES,MAYBE,\PathDY/subj/defn/some-file-name-20140720.txt,6

첫 번째 부분은 으로 풀 수 있는데 sort -t, -k1,1, 두 번째 부분은 파일 이름의 대시 개수가 고정되어 있지 않아서 매일 어떻게 해야 할지 모르겠어요. 따라서 -구분 기호를 사용하여 열 번호를 지정할 수는 없습니다 .

원하는 출력:

AX,NO,NO,\PathAX/subj/categ/some-file-name-20151229.txt,
CXX,YES,YES,\Path/subj/categ/some-file-20140503.txt,6
CXX,NO,NO,\PathCXX/subj/categ/some-file-name-20151229.txt,
DY,YES,MAYBE,\PathDY/subj/categ/some-file-name-20140720.txt,6

노트:

나는 그것이 도움이 된다고 생각한다:

  • 다음 YYYYMMDD마지막파일 이름과 파일 확장자 앞에 대시가 있습니다.
  • 앞의 대시는 YYYYMMDD항상 존재하므로 대시가 하나 이상 있습니다.
  • 파일 확장자 외에는 파일에 다른 점이 없습니다.

마지막 문자를 파일에 나타나지 않는 다른 문자로 바꾼 다음 정렬하고 대시로 바꾸는 2단계 프로세스를 생각할 수 있지만 -더 쉬운 방법이 있는지 궁금합니다.

플랫폼:

  • 애플 시스템 10.9.5

답변1

그러한 문제를 해결하기 위한 일반적인 접근 방식(다음과 같이 설명할 수 없는 문제의 경우)질소번째 줄)은 정렬 키를 앞에 추가한 다음 정렬하고 정렬 키를 제거하도록 줄을 다시 작성하는 것입니다. sed 또는 awk와 같은 보다 유연한 도구를 사용하여 정렬 키를 결정할 수 있습니다.

날짜를 정확히 어떻게 결정하는지 모르겠습니다. 행의 마지막 8자리 시퀀스를 선택하고 필요에 따라 조정하겠습니다.

sed 's/.*\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)/\1,&/; t; s/^/,/' |
sort -t, -k2,2 -k1,1 |
cut -d, -f 2-

줄에 8자리 시퀀스가 ​​포함되어 있지 않으면 sed 스크립트의 비트는 t; s/^/,/앞에 쉼표를 추가합니다. 그렇지 않으면 마지막 단계에서 쉼표로 구분된 첫 번째 필드를 제거합니다.

답변2

다음과 같이 사용할 수 있습니다.

rev text | sed 's/-/,/1' | rev | sort -t, -k1,1 -k5,5 | rev | sed 's/,/-/2' | rev

여기서 text는 콘텐츠가 포함된 파일입니다. 이 방법은 타임스탬프 뒤에 쉼표가 있고 파일 이름에 쉼표가 없는 경우에 작동합니다.

실제로는 무엇을 합니까?

  1. 반전 라인
  2. 역행의 첫 번째 "-"를 ","로 변경합니다. (실제로는 역행의 마지막 "-"입니다.)
  3. 실제 선과 일치하도록 다시 뒤집어 주세요.
  4. 이제 첫 번째와 다섯 번째 필드(datetime)를 정렬하고 ","를 필드 구분자로 사용합니다.
  5. 다시 반전
  6. 두 번째로 나타나는 ","를 "-"로 변경(이전 상태로 되돌리기)
  7. 출력을 뒤집어서 인쇄하세요.

관련 정보