ファイルの一部のソート

ファイルの一部のソート

端末で2番目の列に基づいてファイルをソートする方法ファイルの内容は次のとおりです。

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5

使用してsort -t' ' -nk2も正しい結果が出ません。また、ファイルの内容がソートされたままになるようにするにはどうすればよいですか?

答え1

私の考えであなたが望むのはこれです:

方法#1:頭と尾を使う

$ (head -n 2 sample.txt; tail -n +3 sample.txt | sort -t' ' -nk2) > a.tmp && mv a.tmp sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

これにより、テキストファイルの最初の行をインポートし、最初の2行以降のすべての項目をインポートしてソートします。

方法 #2: ヘッダーのみを使用

$ (head -n 2; sort -t' ' -nk2) < sample.txt > a.tmp && mv a.tmp sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

テキストファイルを入力として使用して、最初の行のみを表示し、残りの行を並べ替えます。

ファイルを適切に編集するのは一般的に良い考えではありません。可能ですが、中間ファイルを使用する方が良いです。

方法#3:中間ファイルなしで#2を実行する

@StephaneChazelasのアイデアを借りて、 "1 <>"表記を使用してファイルを読み書きするために開くことができますsort

$ (head -n 2; sort -nk2) < sample.txt 1<> sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

答え2

現在の場所にあるファイルを上書きするには、次のようにします。

{
  head -n 2 &&
    sort -k2n
} < the-file.txt 1<> the-file.txt

sortこれは、出力の書き込みを開始する前に入力を完全に読み取って読み取っているファイルに書き込むことができるために機能します。そして、出力は入力と同じサイズなので、最終的にファイルを切り捨てる必要はありません。

デフォルトの区切り文字の代わりに使用すると、-t' '入力の各空白文字が新しいフィールドを生成します。たとえば、次のようになります。

 a 10
b  2

(前に1マスa、後に2マスがありますb)、-t' ' -nk2(覚えておいてください-k2フィールド2から行末まで-k2,2と同時にフィールド2万)のみが数字"a 10"" 2"比較されますが、単独-nk2で数字" 10""  2"比較されます(数字比較では先行スペースは無視されます)。

答え3

ファイルの2つの部分を並べ替える必要があります。他の答えから大きくインスピレーションを得た拡張答えは次のとおりです。

ファイル.txt

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5

Example
------------
Foo
bar
Baz

Results: Finished!

複数のセクションをリンクして並べ替えることも、接続せずに別のオプションで並べ替えることもできます。最後のステップでcatソートされていないチャンクがすべて出力されます。

(head -n 2; head -n 4 | sort -nk2 ; head -n 3; head -n 3 | sort; cat ) < file.txt 1<> sorted.txt

ソート.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

Example
------------
bar
Baz
Foo

Results: Finished!

関連情報