ファイルの2番目の列に基づいてデータをソートする


212

2列とn行数のファイルがあります。

列1にはnamescolumn2 が含まれますage

このファイルのコンテンツをage(第2列の)に基づいて昇順で並べ替えます。

結果はname、最年少の人と一緒にname、次に2番目に若い人などを表示します...

ワンライナーシェルまたはbashスクリプトの提案。


1

回答:


329

sort次のコマンドを使用できます。

sort -k2 -n yourfile

-n--numeric-sort文字列数値評価に従って比較

例えば:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
また、注意して使用して-hの代わりに-nソート人間が読めるような値になる2G3Kだけでなく、数字がで区切られ、コンマなど1,234.5
chillitom

「間違った」注文で直面する問題。「***警告***環境で指定されたロケールがソート順に影響しLC_ALL=Cます。ネイティブのバイト値を使用する従来のソート順を取得するように設定してください。」に注意してください。(なしの文字列一致の場合-n
x'ES

-kは行の終わりまで読み取るので、これは最初の列のスペースを考慮せず、2番目の列の後にさらに列がある場合も機能しません。仮にそれがより良い解決策があるTSVファイルであるsort -t$'\t' -k2 -n FILE
tuxErrante

-tオプションを使用して区切り文字を指定する必要がある場合があります
スペクトル

85

解決:

sort -k 2 -n filename

より冗長に次のように書かれます:

sort --key 2 --numeric-sort filename


例:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

説明:

  • -k -この引数は、ソートに使用される最初の列を指定します。(ここでの列は空白で区切られたフィールドとして定義されていることに注意してください。引数-k5は、各行の5番目の文字ではなく、各行の5番目のフィールドからソートされます)

  • -n-このオプションは、「数値ソート」を指定します。これは、列がテキストではなく数値の行として解釈されることを意味します。


もっと:

その他の一般的なオプションは次のとおりです。

  • -r-このオプションは、ソート順を逆にします。--reverseと書くこともできます。
  • -i-このオプションは、印刷できない文字を無視します。--ignore-nonprintingと書くこともできます
  • -b-このオプションは、先頭の空白スペースを無視します。これは、行数を決定するために空白が使用されるので便利です。--ignore-leading-blanksと書くこともできます。
  • -f-このオプションは大文字小文字を無視します。"A" == "a"。--ignore-caseと書くこともできます。
  • -t [新しいセパレーター] -このオプションは、前処理でスペース以外の演算子を使用します。--field-separatorと書くこともできます。

他のオプションもありますが、これらは私が頻繁に使用する最も一般的で役立つオプションです。


@Angeloこの質問は、この質問の回答を受け入れてから数年後に投稿されたと考えられますが、新しい回答と見なしましたか?
ジョナサンY.17年

オプション-tは実生活の節約でした!! 列にスペースがあり、列が,タブやタブなどの特定の文字によって異なる場合
AKS

12

タブ区切り値の場合、以下のコードを使用できます

sort -t$'\t' -k2 -n

-rは、降順でデータを取得するために使用できます。
-n数値ソートの場合
-k、--key = POS1 [、POS2]ここで、kはファイル内の列です
。以下の降順のコードはコードです

sort -t$'\t' -k2 -rn

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.