awkを使用してタイムスタンプを分解してフォーマットします。

awkを使用してタイムスタンプを分解してフォーマットします。

次のファイル名の場合:

fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt

私が達成したいのは、awkファイル名を分離して.xmlからcsv /データベースで使用するためにタイムスタンプを分離してフォーマットすることです。

私は以下を持っています:

NR==1 {
    fn=substr(FILENAME, 0, FILENAME-5);
    ts=fn;                                                                                                                                                                                                
    sub(/[0-9]{4}.*$/,"",fn);                                                                                      
    sub(/^\w+\.xml/,"",ts);
} {
     printf "fn\tts"
}

末尾から "-"を削除することができますが、残りのタイムスタンプを2017-11-30 21:00:59

ベストアンサー1

これはうまくいきます。私は個人的にawkを使用しませんが、正確な型操作を簡単にするいくつかの優れた機能を持つgawk、gensub()を使用します。

echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | awk '{
  gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
  date=$0; 
  time=$0; 
  sub(/[-_][0-9]{2}_[0-9]{2}_[0-9]{2}$/,"",date); 
  sub(/^[0-9]{4}-[0-9]{2}-[0-9]{2}[-_]/,"",time);
  gsub(/_/,":",time);
  print date " "  time 
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59

awkを指定したので、これはやや基本的ですが、1つのアプローチです。

gensub がないため、$0 の値を 2 つの保有者に送信して、1 つの保有者の先頭と他の保有者の終わりを削除することができます。

ご覧のとおり、初期起動/終了を簡単に削除し、追加の処理のために日付/時刻データのみを残すのは簡単です。

gawkとgensubを使用する方が簡単です。

echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | gawk '{
  gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
  datetime = gensub(/^([0-9-]{10})[-_]([0-9_]{8})$/,"\\1 \\2",1,$0);
  gsub(/_/,":",datetime);
  print datetime 
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59

開始/終了パターンは同じことを行います。 1つは実際のパターンを取得してコピーし、2番目は[0-9-]に一致する最初の10個と[0-9_]に一致する最後の8個を提供します。コンテンツと一致するかどうかは、どちらがより読みやすいかによって異なります。

本当の質問は、これがPerlを使用する方が良いかどうかです。

おすすめ記事