다음과 같은 목록이 있습니다.
1,kg,cat
1000,g,dog
20,g,apple
무게순으로 정렬하고 싶습니다. 1kg과 1000g은 동일하므로 무게별로 정렬하고 싶습니다. 내 데이터 세트는 더 크고 단위가 다르며 코드가 3000g이 1kg보다 크다는 것을 인식할 수 있도록 정렬하는 방법을 알고 싶습니다.
답변1
파일이 너무 커서 메모리에 맞지 않는 경우 다음을 수행할 수 있습니다.
$ awk -F, -v OFS="," '$2=="kg"{$1=1000*$1}1;' file | sort -n |
awk -F, -v OFS="," '$2=="kg"{$1=$1/1000}1;'
1000,g,dog
1,kg,cat
20,g,apple
답변2
나는 기존 데이터를 변경하지 않지만 정렬 기준을 새 열로 추가하고 파이프라인 끝에서 보조 정렬 필드를 제거하는 변형을 선호합니다.
awk -F, 'BEGIN {u["kg"]=1000; u["g"]=1}; {print $1*u[$2], $0}' file |
sort -n | cut -d" " -f2-
답변3
파일의 단위를 변환하고 정렬한 후 결과 저장 파일을 사용하는 것이 더 좋습니다.
sed -r 's/^([0-9]+),kg/\1000,g/' $file | sort -n
sed
수학을 이해하지 못하므로 정수가 아닌 경우 다른 것을 사용해야 합니다. 다음은 빠른 구문 분석을 위해 sed를 사용하지만 bc
필요한 경우 실제 계산을 수행합니다.
sed -r 's/^([0-9]+),kg/\1000,g/;s/^([0-9\.]+),kg/echo $(echo \1*1000 | bc),g/e'