質問

次の形式のデータがあります:

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' および -kF、Fg (たとえば、7番目のフィールドの -k7,7g )は動作しました。 -t $ '\ t' なしの -kF、Fg は機能しませんでした。

タブのみを使用して簡単にしたい場合は、スペースをタブに置き換えます:

tr " " "\t" < <file> | sort <options>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top