列3によるawkソートの使用方法


90

私はこのようなファイル(user.csv)を持っています

ip,hostname,user,group,encryption,aduser,adattr

ユーザーごとに並べ替えられたすべての列を印刷したい、

試しましたがawk -F ":" '{print|"$3 sort -n"}' user.csv、動作しません。


11
sort -t, -k3 file
ケビン

回答:


174

どうですかsort

sort -t, -nk3 user.csv

どこ

  • -t,-区切り文字をとして定義します,

  • -n-数値ソートを提供します。あなたがあなたの試みでそれを追加したので追加されました。ユーザーフィールドがテキストのみの場合は、必要ありません。

  • -k3-フィールド(キー)を定義します。userは3番目のフィールドです。


2
ソート2列を使用するにはどうすればよいですか?たとえば、最初に列6で並べ替え、次に列3で並べ替えます。
user2452340 2013年

1
CSVにカンマを含む引用符で囲まれた文字列がある場合、これは機能しません(並べ替える列がカンマを含む列よりも前である場合を除く)。最初にawkでパスを作成する必要がある場合があります(FPAT = "[^、] * | \" [^ \ "] * \" "およびOFS =" | "、または並べ替えで使用できるその他の区切り文字を使用)
davemyron 2015年

1
@ user2452340これを行うことができます:sort -t, -nk3 filename.csv | sort -t, -nk6-最初に列3で並べ替え、次に列6で並べ替えるので、列6は完全に正しく並べ替えられ、列6が同じ行の場合は、列3で並べ替えられます。 。
マタイ

3
@Matthewのsort -t ',' -k3,3n -k6,6n方が良いでしょう。-k3列3と残りの行を使用します。
クサラナンダ2016

1
私はちょうど感謝jaypal、カンマで割った私の2列のファイルを分割するために、-tを必要と
リカルド・リベラNievesには、

20
  1. awkを使用して、ユーザーIDを前に置きます。
  2. ソート
  3. ユーザーIDにスペースが含まれていない場合は、sedを使用して重複するユーザーIDを削除します。

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

これは、特に列を解析または結合して並べ替えフィールドを追加し、元の行のみを保持する必要がある場合に非常に便利です。awk / splitを使用して、並べ替えの日付と時刻のフィールドを解析/結合してから、削除しました。
スカイテイカー2017年

1
sort特定の列で並べ替える方法はすでに知っていますが、この手法(Schwartzian変換と呼ばれます)は、並べ替えるフィールドが明確に定義された列ではない場合に役立ちます。
トリプリー


9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

逆順の場合

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 


2
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

これはうまくいくはずです


0

最初の行(ヘッダー)を並べ替えから除外するために、2つのバッファーに分割しました。

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.