Solaris의 sort -z와 동일(여러 줄 정렬 지원)

Solaris의 sort -z와 동일(여러 줄 정렬 지원)

나는 여러 줄의 "청크" 지원을 얻을 수 있도록 "sort -z"(GNU에서만 지원됨)에 해당하는 Solaris를 찾고 있습니다. 일부 텍스트를 시간순(날짜, 시간)으로 정렬하고 정렬 과정에서 텍스트 블록이 파괴되지 않도록 하고 싶습니다.

예를 들어 다음과 같습니다.

2020-05-15:02:00:00:000 INFO[LF]
2020-05-15:02:00:02:000 INFO[LF]
[HT]some extra data as second line[LF]
[HT]2020-05-15:02:00:01:000 INFO[LF]
[HT]some extra data as second line[LF]
[HT]some extra data as third line[LF]
2020-05-15:02:00:04:000 INFO[LF]
2020-05-15:02:00:03:000 INFO[LF]
  • [HT]는 가로 탭 키이고, [LF]는\n

다음과 같이 분류하고 싶습니다.

2020-05-15:02:00:00:000 INFO[LF]
2020-05-15:02:00:01:000 INFO[LF]
[HT]extra data as second line[LF]
[HT]some extra data as third line[LF]
2020-05-15:02:00:02:000 INFO[LF]
[HT]extra data as second line[LF]
2020-05-15:02:00:03:000 INFO[LF]
2020-05-15:02:00:04:000 INFO[LF]

Centos/ubuntu(GNU)에서는 다음과 같이 처리했습니다. sort -zt : -k2,2 -k3,3n -k4,4n -k5,5n -k6,6n (milisec이 올바르게 정렬되는지는 확실하지 않습니다).

참고:

  1. msort를 사용할 수 없습니다. awk/sed/perl 한 줄 솔루션을 환영합니다.
  2. 여러 줄이 있는지 여부에 관계없이 각 줄은 LF로 끝납니다.
  3. 여러 줄(앞의 두 번째 줄 포함)은 HF "탭" 문자로 시작됩니다.

감사해요:-)

답변1

그리고 perl:

perl -0777 -ne 'print sort /^\d.*\n(?:\D.*\n)*/gm' your-file

전체 파일을 메모리에 로드하고(slurp 모드 사용 -0777 -p) 정규식( ^숫자( )로 시작하는 줄 다음에 \d0개 이상의( ) 줄이 오는 라인)을 기반으로 청크를 추출한 다음 메모리에 저장합니다.*\Dprintsort

답변2

널로 구분된 레코드를 정렬하려면 데이터에 나타나지 않는 문자가 보장되는 경우 tr이를 널 바이트로 바꿀 수 있습니다. 그러나 이는 데이터가 줄 바꿈으로 구분되고 GNU 정렬에도 특정 줄 바꿈만 구분 기호로 처리하는 옵션이 없기 때문에 직접적인 도움이 되지 않습니다. 개행 시퀀스를 개행 문자가 포함되지 않은 항목으로 변환한 다음 정렬한 다음 원래 번역을 실행 취소해야 합니다.

데이터에 일부 줄의 시작 부분에 있는 단일 탭을 제외하고 탭이 없다고 가정하면 탭 앞의 줄 바꿈을 제거하고 정렬 후에 다시 추가하는 것이 번역될 수 있습니다.

awk '/^\t/ {line = line $0; next}
     {print line; line = $0}
     END {print line}' |
sort |
awk '{gsub(/\t/, "\n\t"); print}'

관련 정보