Linux 정렬 마지막 열

Linux 정렬 마지막 열

다음 출력을 얻기 위해 제어할 수 없는 스크립트를 실행하고 있습니다. 마지막(3번째) 열을 기준으로 정렬하고 싶습니다. 각 열은 공백으로 구분되며 두 번째 열에는 공백/기호가 포함됩니다.

    > ./script
    37622       (this is || test1)&&(SGD||HKD||RMB)     40010
    43944       (this is)&&(SGD||HKD)    102732
    79378       (this is||test2)&&(HKD||RMB)    205425
    457000      (test2) && (SGD||RMB||HKD||YEN)        71
    559658      (test1||test2)&&(RMB||YEN||SGD)     14043

sort -k를 사용해 보았지만 작동하지 않습니다. 그러다가 이 문제를 발견했습니다——마지막 열을 기준으로 숫자를 정렬하는 방법은 무엇입니까?- 제공되는 솔루션은

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

내 질문은: 스크립트를 실행할 때 이를 어떻게 활용할 수 있습니까?

    > ./script | <something??>

감사해요.

답변1

연결된 파이프를 직접 조정할 수 있습니다.

$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '

awk표현식 에서 $x현재 행의 x번째 열(1부터 시작)을 참조합니다 . 미리 정의된 변수는 NF현재 행의 열 번호를 저장하므로 print $NF,$0마지막 열과 전체 행이 각 행에 대해 인쇄됩니다( $0전체 행이 표시되므로). . 그런 다음 명령은 cut각 행의 두 번째 열부터 마지막 ​​열까지 출력합니다.

정렬 부분은 -k1,1첫 번째 열만 정렬 키로 사용됨을 의미합니다. 이는 여러 행이 첫 번째 열에서 동일한 값을 갖는 경우에만 차이를 만듭니다. 이 경우 다음 -k1,1열은 상대적 순서(보조 정렬 키 등)에 영향을 미치지 않습니다. 첫 번째 열만 -k1,1정렬 키로 사용되며 동일한 키를 가진 행의 상대적 순서는 변경되지 않습니다(즉, 안정적인 정렬 수행).

sed

sort또는 다음을 사용하여 문제를 해결할 수 있습니다 sed.

$ ./script | sed 's/^\(.\+[ \t]\+\)\([0-9]\+ *\)$/\2 \1/' | \
     sort -k1,1 -n | sed 's/^\([0-9]\+\) \(.\+\)$/\2 \1/'

첫 번째 줄 끝에 있는 개행 문자는 이스케이프 처리됩니다 \. 이를 제거 \하고 한 줄로 파이프할 수 있습니다.

먼저 마지막 열을 앞으로 이동하고 첫 번째 열을 기준으로 정렬한 다음 다시 뒤로 가져오는 것이 아이디어입니다.

마지막 열이 [ \t]\+공백(공백 또는 탭)으로 구분되어 있다고 가정합니다.

표현식은 sed그룹 참조(예 \2 \1: )를 통해 교환됩니다. 그룹은 괄호를 이스케이프하여 패턴에 표시됩니다.\(...\)

관련 정보