期待どおりに機能しない列ベースの並べ替え

期待どおりに機能しない列ベースの並べ替え

cat marks.txt返品

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

awk -F" " '{ print $4"\t" $0 }' marks.txt | sort | cut -f 2-4番目の列に基づいてテキストを正常にソートしました。

コンテキスト:https://stackoverflow.com/questions/17048188/how-to-use-awk-sort-by-column-3
ただし、最も投票された回答を模倣するには、sort -t" " -nk4 marks.txt 次のように返します。

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

注文句が機能しないのはなぜですか?

答え1

(ここでは、フィールド区切り文字としてスペース文字)を使用すると、連続するすべてのスペースを単一の区切りsort -t' '文字として扱うのではなく、各スペースをフィールド区切り文字として扱うため、期待される結果は得られません。そのため、最後のスペースを区別するために最初のカンマソリューションが提供されました。フィールドを専用のタブ区切り文字として指定し、そのフィールドに基づいてソートしてから出力から削除します。

awk commnadでここを使用すると、-F" "コマンドの出力や処理に副作用がなく、削除できます。また、awkで使用すると、連続する-F" "スペースを単一の区切り文字として扱いますが、ソートではすべての単一のスペースを別々の区切り-t" "文字として扱います(awkでそれに対応するのは、フィールド区切り-F"[ ]"文字を正規表現として定義することです)。

結局、次のようにすることをお勧めします。

awk '{ print $NF"\t"$0 }' marks.txt |sort |cut -f2-

答え2

-Fスペースと一緒にinを使用することとスペースと一緒にawk使用することの-t違いsortは次のとおりです。

  • awk -F ' '以前と同じですawkFS(内部フィールド区切り記号)のデフォルト値は空白です。これにより、awkデータの横スペース(タブおよび/またはスペース)が切り捨てられ、連続スペースで区切られた部分文字列がフィールドとして処理されます。

  • sort -t ' '各スペースを区切り文字として扱います。sortなしで使用すると、-tユーティリティは連続するawkスペース(タブおよび/またはスペース)と同じ方法で各行をフィールドに分割します。

最初のコマンド、

awk -F" " '{ print $4"\t" $0 }' marks.txt | sort -n | cut -f 2-

(ㅏシュワルツ変換) したがって

awk '{ print $4 "\t" $0 }' marks.txt | sort -n | cut -f 2-

または、OFS出力フィールドの区切り記号をタブとして設定を使用します。

awk -v OFS='\t' '{ print $4, $0 }' marks.txt | sort -n | cut -f 2-

-n(上記の追加事項も参照してくださいsort。数字で並べ替えたいと思います。)

明示的なアクセス最後1行あたりのフィールドでは、さまざまな数の異なるフィールドを許可します(たとえば、スペースが含まれている場合など)。

awk -v OFS='\t' '{ print $NF, $0 }' marks.txt | sort -n | cut -f 2-

sort次のように、スペースで区切られた4番目の列に基づいて数値を正しくソートするようにコマンドを再作成できます。

sort -k 4n marks.txt

明らかに、これは各データ行に常にスペースで区切られた4つのフィールドが含まれていると仮定します。

関連情報