
다음 출력을 얻기 위해 제어할 수 없는 스크립트를 실행하고 있습니다. 마지막(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
. 그룹은 이스케이프된 괄호를 통해 패턴으로 표시됩니다.\(...\)