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. 그룹은 이스케이프된 괄호를 통해 패턴으로 표시됩니다.\(...\)

관련 정보