
CSVファイル内のすべての列を列名でソートしようとしています。私が持っているのはこれです:
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
私が必要とする出力は
adress ,name ,mobile-number
USA ,Ane ,12121212
England,Joane ,234234
問題は、3つ以上の列があり、並べ替え順序がわかりませんが、昇順で並べ替える必要があることです。
答え1
Miller(mlr
)を使用して、ヘッダーを含む各フィールドの余分なスペースをクリーンアップし、フィールドの順序を変更します。
$ mlr --csv clean-whitespace then reorder -f adress,name,mobile-number file
adress,name,mobile-number
USA,Ane,12121212
England,Joane,234234
(を使用すると、フィールドはフィールドの先頭にのみreorder -f adress
移動されます。この場合、同じ効果があります。)adress
または、ヘッダーのソート方法に従ってフィールドを昇順にソートしたい場合:
$ mlr --csv clean-whitespace then sort-within-records file
adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane
答え2
私たちができることは、次のように列を行に置き換えることです。rs
BSD Unixから派生したユーティリティで行のみsort
(したがって、元のデータの列を効果的にソート)してから、もう一度置き換えます。
まず、カナダ順に住所、携帯電話番号、名前順ですのでご参考ください。 MがNの前に!
ステップバイステップ:
$ cat data
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
$ rs -s, -C, -T < data
name ,Ane ,Joane ,
adress ,USA ,England ,
mobile-number,12121212,234234,
$ rs -s, -C, -T < data | sort
adress ,USA ,England ,
mobile-number,12121212,234234,
name ,Ane ,Joane ,
$ rs -s, -C, -T < data | sort | rs -s, -C, -T
adress ,mobile-number,name ,
USA ,12121212,Ane ,
England ,234234,Joane ,
$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T
adress mobile-number name
USA 12121212 Ane
England 234234 Joane
ついに:
$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T | sed -e 's/ \([^ ]\)/,\1/g'
adress ,mobile-number ,name
USA ,12121212 ,Ane
England ,234234 ,Joane
私はUbuntu GNU / Linuxでこれを行いましたsudo apt-get install rs
。
答え3
使用幸せ(以前のPerl_6)
~$ raku -MText::CSV -e 'my @dta = csv(in => $*IN, sep => ",", strict => True)>>.trim; \
my $index = @dta.[0].pairs.sort(*.value).map: *.key; \
@dta.=map( *.[$index.cache]); csv(in => @dta, out => $*OUT);' file
Rakuは、高度なUnicodeをサポートするPerlファミリのプログラミング言語です。上記の言語は、Rakuモジュールのコマンドラインで使用されていますText::CSV
。
入力例:
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
出力例:
adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane
つまり、メソッド/関数を使用してデータを読み込みcsv(...)
、項目の周囲のスペースを削除しtrim
、 @dta
配列に格納するために使用します。項目を番号付けに変換し、ing byでソートし、ソートされた数字を取得する方法で、最初の行でAnが$index
生成されます。次に、並べ替えられた列で上書きします。最後に、ファイルは標準出力に配置されます。[0]
@dta
pairs
sort
value
key
@dta
.=
$index
csv
out
$*OUT
注:ペアを削除するための呼び出しは、>>.trim
次のように項目に末尾のスペースを含む二重引用符で囲まれた列値を返します。RFC 4180。など、インデックスコードを追加して列の並べ.reverse
替え順序を逆にします[$index.cache.reverse]
。
>>.trim
次のない出力例.reverse
:
"name ",mobile-number,"adress "
"Ane ",12121212,"USA "
"Joane ",234234,"England "
https://github.com/Tux/CSV/blob/master/doc/Text-CSV.md
https://docs.raku.org
https://raku.org