最後の文字でソート

最後の文字でソート

ファイルに基づいてソートしたいです。

  • テキスト今後最初のカンマ、そして
  • YYYYMMMDDサンプル入力の日付に基づいてセカンダリソートを実行したいと思います。

入力例:

AX,NO,NO,\PathAX/subj/defn/some-file-name-20151229.txt,
CXX,NO,NO,\PathCXX/subj/defn/some-file-name-20151229.txt,
CXX,YES,YES,\Path/subj/defn/some-file-20140503.txt,6
DY,YES,MAYBE,\PathDY/subj/defn/some-file-name-20140720.txt,6

最初の部分はで解くことができますがsort -t, -k1,1、2番目の部分はファイル名のダッシュ数が固定されていないため、毎日どのようにすればよいかわかりません。したがって、-区切り文字を使用して列番号を指定することはできません。

希望の出力:

AX,NO,NO,\PathAX/subj/categ/some-file-name-20151229.txt,
CXX,YES,YES,\Path/subj/categ/some-file-20140503.txt,6
CXX,NO,NO,\PathCXX/subj/categ/some-file-name-20151229.txt,
DY,YES,MAYBE,\PathDY/subj/categ/some-file-name-20140720.txt,6

メモ:

私はそれが役に立つと思います:

  • YYYYMMDD最後ファイル名とファイル拡張子の前にダッシュがあります。
  • 前のダッシュはYYYYMMDD常に存在するため、ダッシュが1つ以上あります。
  • ファイル拡張子以外のファイルには他に何もありません。

最後の文字をファイルに表示されない他の文字に置き換えてから、並べ替えてダッシュに置き換える2段階のプロセスを考えることができますが、-より簡単な方法があるかどうか疑問に思います。

プラットフォーム:

  • アップルシステム 10.9.5

答え1

そのような問題を解決するための一般的なアプローチ(次のように説明できない問題の場合)窒素1行目は、ソートキーを前に追加してからソートし、ソートキーを削除するように行を再構築することです。 sedやawkなどのより柔軟なツールを使用してソートキーを決定できます。

日付を正確にどのように決定するのかわかりません。行の最後の8桁のシーケンスを選択し、必要に応じて調整します。

sed 's/.*\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)/\1,&/; t; s/^/,/' |
sort -t, -k2,2 -k1,1 |
cut -d, -f 2-

行に8桁のシーケンスが含まれていない場合、sedスクリプトのビットはt; s/^/,/前にコンマを追加します。それ以外の場合は、最後のステップでカンマ区切りの最初のフィールドを削除します。

答え2

次のように使用できます。

rev text | sed 's/-/,/1' | rev | sort -t, -k1,1 -k5,5 | rev | sed 's/,/-/2' | rev

ここで、textはコンテンツを含むファイルです。この方法は、タイムスタンプの後にコンマがあり、ファイル名にカンマがない場合に機能します。

実際には何をしますか?

  1. 反転ライン
  2. 逆行の最初の「-」を「、」に変更します。 (実際には逆行の最後の「-」です。)
  3. 実際の線と一致するように再び反転してください。
  4. 最初と5番目のフィールドを並べ替え、フィールド区切り文字として「、」を使用します。
  5. 再び反転
  6. 2番目に表示される「、」を「-」に変更(以前の状態に戻す)
  7. 出力を反転して印刷します。

関連情報