コンマ区切りのリストで構成される多数の行を含むファイルがあります。これらの各行を並べ替えたいと思います。
1行あれば簡単です:
<file tr ',' '\n' | sort | tr '\n' ','
しかし、ファイルでこれを行うと、不要なすべての行がまとめられます。これを制限するにはどうすればよいですか?
コンマ区切りのリストで構成される多数の行を含むファイルがあります。これらの各行を並べ替えたいと思います。
1行あれば簡単です:
<file tr ',' '\n' | sort | tr '\n' ','
しかし、ファイルでこれを行うと、不要なすべての行がまとめられます。これを制限するにはどうすればよいですか?
Perlでは(かなり)簡単です:
#!/usr/bin/env perl
use strict;
use warnings;
$, = ",";
while (<>)
{
chomp;
my @fields = split /,/;
my @sorted = sort(@fields);
$sorted[scalar(@sorted)-1] .= "\n";
print @sorted;
}
トリッキーなのは、並べ替えられた配列を保存して、改行を配列の最後の要素に追加できるようにすることです。これにより、行がカンマで終わることはありません。それが問題にならない場合は、よりコンパクトになります — ループの最後の 3 行を次のように置き換えます。
print sort(@fields), "\n";
x,b,z,a,c,e,f,g,d
3,19,12,17,16,19,18,17,20,16
a,b,c,d,e,f,g,x,z
12,16,16,17,17,18,19,19,20,3
それはPerlなので、圧縮する方法があります:
perl -l -p -a -F, -e '$_ = join(",", sort(@F))'
それは:
-lautochomp して改行を処理します。-p各入力行を自動的に読み取り、スクリプトで処理し、各行の後に出力します。-aFフィールドセパレーターに基づいて入力行を配列に分割します。-F,フィールド区切り文字はコンマです。-eプログラムが続きます。$_配列 内の並べ替えられた値のコンマ結合リストに設定しますF。残りは Perl が処理します。
行ごとに行う必要があります。ループを使用します。
while read -r line; do
echo "${line}" | tr ',' '\n' | sort | tr '\n' ','
done < file
(言う<file tr ',' '\n'と、ファイル全体でコンマが改行に置き換えられます。)
過度のパイプを避け、GNU awk ですべての並べ替えを行うことができます。
awk '{split($0, a, ","); n=asort(a);
for (i=1; i<=n; i++) printf "%s%s", a[i], (i<n)?OFS:RS}' OFS=, file