最後の文字でソート

最後の文字でソート

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

  • テキスト今後最初のカンマ、そして
  • 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/^/,/前にコンマを追加します。それ以外の場合は、最後のステップでカンマ区切りの最初のフィールドを削除します。

おすすめ記事