ファイルに基づいてソートしたいです。
- テキスト今後最初のカンマ、そして
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はコンテンツを含むファイルです。この方法は、タイムスタンプの後にコンマがあり、ファイル名にカンマがない場合に機能します。
実際には何をしますか?
- 反転ライン
- 逆行の最初の「-」を「、」に変更します。 (実際には逆行の最後の「-」です。)
- 実際の線と一致するように再び反転してください。
- 最初と5番目のフィールドを並べ替え、フィールド区切り文字として「、」を使用します。
- 再び反転
- 2番目に表示される「、」を「-」に変更(以前の状態に戻す)
- 出力を反転して印刷します。