タブ区切りファイルの並べ替え
-
10-07-2019 - |
質問
次の形式のデータがあります:
foo<tab>1.00<space>1.33<space>2.00<tab>3
今、最後のフィールドに基づいてファイルを並べ替えようとしました。 次のコマンドを試しましたが、予想どおりにソートされませんでした。
$ sort -k3nr file.txt # apparently this sort by space as delimiter
$ sort -t"\t" -k3nr file.txt
sort: multi-character tab `\\t'
$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
sort: multi-character tab `\\t'
それを行う正しい方法は何ですか?
>解決
bash を使用すると、これでうまくいきます:
$ sort -t
一重引用符で囲まれた文字列の前のドル記号に注意してください。あなたはについて読むことができます
bash <のANSI-C引用セクションマニュアルページ。
\t' -k3 -nr file.txt
一重引用符で囲まれた文字列の前のドル記号に注意してください。あなたはについて読むことができます bash <のANSI-C引用セクションマニュアルページ。
他のヒント
デフォルトでは、フィールドの区切り文字は空白から空白への遷移ではないため、タブは正常に機能します。
ただし、列のインデックスはベース1およびベース0なので、おそらく必要です
sort -k4nr file.txt
file.txtを列4で逆順で数値順にソートします。 (質問のデータには5つのフィールドもあるので、最後のフィールドはインデックス5になります。)
-t \の後に実際のタブ文字を配置する必要があります。これを行うには、シェルでctrl-vを押してからタブ文字を押します。私が使用したほとんどのシェルは、このモードのリテラルタブエントリをサポートしています。
ただし、別の場所からコピーして貼り付けるとタブが保持されないため、注意してください。
$の解決策はうまくいきませんでした。 ただし、実際にコマンドにタブ文字自体を入れることにより、 sort -t '' -k2
awk '{print print $ 1&quot; \ t&quot; $ 2&quot; \ t&quot; $ 3&quot; \ t&quot; $ 4&quot; \ t&quot; $ 5}'
のようにパイプします。これにより、スペースがタブに変更されます。
一般に、このようなデータを保持するのは、避けることができるのであれば、あまり良いことではありません。人々は常にタブとスペースを混同しているからです。
Perl、Python、Rubyなどのスクリプト言語では、問題の解決は非常に簡単です。コードの例を次に示します。
#!/usr/bin/perl -w
use strict;
my $sort_field = 2;
my $split_regex = qr{\s+};
my @data;
push @data, "7 8\t 9";
push @data, "4 5\t 6";
push @data, "1 2\t 3";
my @sorted_data =
map { 一般に、このようなデータを保持するのは、避けることができるのであれば、あまり良いことではありません。人々は常にタブとスペースを混同しているからです。
Perl、Python、Rubyなどのスクリプト言語では、問題の解決は非常に簡単です。コードの例を次に示します。
<*>->[1] }
sort { $a->[0] <=> $b->[0] }
map { [ ( split $split_regex, 一般に、このようなデータを保持するのは、避けることができるのであれば、あまり良いことではありません。人々は常にタブとスペースを混同しているからです。
Perl、Python、Rubyなどのスクリプト言語では、問題の解決は非常に簡単です。コードの例を次に示します。
<*> )[$sort_field], 一般に、このようなデータを保持するのは、避けることができるのであれば、あまり良いことではありません。人々は常にタブとスペースを混同しているからです。
Perl、Python、Rubyなどのスクリプト言語では、問題の解決は非常に簡単です。コードの例を次に示します。
<*> ] }
@data;
print "unsorted\n";
print join "\n", @data, "\n";
print "sorted by $sort_field, lines split by $split_regex\n";
print join "\n", @sorted_data, "\n";
WindowsでGnuソートのソリューションが必要でしたが、上記のソリューションはいずれもコマンドラインで機能しませんでした。
ロイドの手がかりを使用して、次のバッチファイル(.bat)が機能しました。
二重引用符内にタブ文字を入力します。
C:\>cat foo.bat
sort -k3 -t" " tabfile.txt
「general-numeric-sort」を使用すると、bashシェルのcygwinでのソートでこの問題が発生していました。 -t $ '\ t' -kFg
(Fはフィールド番号)を指定した場合、機能しませんでしたが、 -t $ '\ t' の両方を指定した場合code>および
-kF、Fg
(たとえば、7番目のフィールドの -k7,7g
)は動作しました。 -t $ '\ t'
なしの -kF、Fg
は機能しませんでした。
タブのみを使用して簡単にしたい場合は、スペースをタブに置き換えます:
tr " " "\t" < <file> | sort <options>