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