파일을 기준으로 정렬하고 싶습니다.
- 텍스트앞으로첫 번째 쉼표, 그리고
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는 콘텐츠가 포함된 파일입니다. 이 방법은 타임스탬프 뒤에 쉼표가 있고 파일 이름에 쉼표가 없는 경우에 작동합니다.
실제로는 무엇을 합니까?
- 반전 라인
- 역행의 첫 번째 "-"를 ","로 변경합니다. (실제로는 역행의 마지막 "-"입니다.)
- 실제 선과 일치하도록 다시 뒤집어 주세요.
- 이제 첫 번째와 다섯 번째 필드(datetime)를 정렬하고 ","를 필드 구분자로 사용합니다.
- 다시 반전
- 두 번째로 나타나는 ","를 "-"로 변경(이전 상태로 되돌리기)
- 출력을 뒤집어서 인쇄하세요.