csv
소득이 다른 파일이 있습니다 . 소득을 기준으로 csv 파일을 정렬하고 싶습니다.높은도착하다낮은값. Python을 사용하지 않고 터미널에서 이 작업을 수행하는 방법을 찾을 수 없습니다.
저는 Python을 사용하고 싶지 않습니다.
mlr
// 와 같은 간단한 것을 사용하고 싶습니다 sed
.awk
입력하다:
name,location,capital,profit-lost,revenue,employees,year
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
산출:
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
수익은 수십억에 달합니다.
누군가가 이 문제를 해결하는 데 도움을 줄 수 있기를 바랍니다.
답변1
따라서 수익(안정적)을 숫자 내림차순으로 정렬하려고 합니다. Miller에서는 이 작업이 쉬울 것 같습니다.null 처리 규칙설명하다:
하나 이상의 빈 정렬 필드 값이 있는 레코드는 모든 정렬 필드 값이 있는 레코드 다음에 정렬됩니다.
이것은 그들이 정렬한다는 것을 의미합니다첫 번째내림차순:
$ mlr --csv sort -nr revenue file.csv
name,location,capital,profit-lost,revenue,employees,year
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
그러나 사용하여그런 다음 링크장식-정렬-장식 해제는 null 수입에 숫자 0을 할당하는 키를 사용하여 간단합니다.
$ mlr --csv put '$key = is_empty($revenue) ? 0 : $revenue' \
then sort -nr key then cut -x -f key file.csv
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
답변2
사용 sort
:
cat input.csv | (sed -u 1q; sort -t, -r -n -k5)
헤더는 sed -u 1q
무시 되어야 합니다 . sort
기본적으로 첫 번째 라인을 처리하고 종료한 다음 나머지를 에 전달한다는 의미 입니다 sort
. 라인을 버퍼링하지 말라는 약어 -u
입니다 .--unbuffered
sed
플래그 정렬:
-t,
구분 기호를 쉼표로 지정합니다.-r
정렬된 출력을 내림차순으로 정렬합니다. 기본값은 오름차순입니다.-n
숫자순으로 정렬합니다.-k5
다섯 번째 키/열을 기준으로 정렬합니다.
데모:
$ cat input.csv | (sed -u 1q; sort -t, -r -n -k5)
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company5,location5,368506.18,11997.04,,,2019
company4,location4,1050987.60,426317.61,,24.90,2021
company2,location2,-155921.70,-146.03,,,2020
company1,location1,35527.19,-33226.25,,0.70,2020
답변3
모든 Unix 시스템에서 사용 가능한 필수 POSIX 도구를 사용하세요.
$ { head -n 1; sort -t, -k5,5rn; } < file
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
아래 댓글을 참고하시고헤드가 출력 라인보다 더 많은 입력 라인을 읽을 수 있습니까?위 스크립트에 대한 추가 중요한 정보입니다.
답변4
사용행복하다(이전 Perl_6)
~$ raku -e 'lines.head.put; my @a = lines(); .put for @a.sort(-*.split(",")[4]);' file
#OR
~$ raku -e 'lines.head.put; .put for lines.sort(-*.split(",")[4]);' file
즉, 첫 번째 줄 line
(헤더 줄)을 읽고 즉시 출력합니다 put
. 그런 다음 나머지 줄을 읽으십시오. 첫 번째 예에서는 값 행이 @a
배열에 저장됩니다. 두 번째 예에서는 행이 직접 정렬됩니다. 이 sort
함수는 매퍼를 사용하고 여기서는 split
쉼표가 있는 행을 정렬한 다음 다섯 번째 열(0 인덱스 = 4)을 사용합니다. 정렬은 알파벳순이므로 정렬 기준 앞에 를 붙이 +
거나 숫자 비교를 강제합니다(예:). 음수 기호는 정렬 순서를 반대로 하는 데 사용됩니다(오름차순 대신 내림차순).-
.sort(+*.split(",")[4]
-*.
입력 예:
name,location,capital,profit-lost,revenue,employees,year
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
예제 출력:
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
더 복잡한 CSV 파일의 경우:
~$ raku -MText::CSV -e 'my @a = csv(in => $*IN); @a[1..*] = @a[1..*].sort(-*.[4]); csv(in => @a, out => $*OUT);' < file
https://docs.raku.org/routine/lines
https://docs.raku.org/routine/split
https://github.com/Tux/CSV
https://raku.org