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 処理ルール説明する:
1つ以上の空のソートフィールド値を持つレコードは、すべてのソートフィールド値を持つレコードの後にソートされます。
これは彼らがソートすることを意味します最初降順:
$ 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
5番目のキー/列に基づいてソートします。
デモ:
$ 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
に格納されます。 2番目の例では、行は直接ソートされます。このsort
関数はマッパーを使用し、ここではsplit
カンマ付きの行をソートしてから、5番目の列(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