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 ' '
以前と同じですawk
。FS
(内部フィールド区切り記号)のデフォルト値は空白です。これにより、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つのフィールドが含まれていると仮定します。