GNU/Linux >> Linux の 問題 >  >> Linux

パイプ区切りファイルのタイムスタンプを再フォーマットする

これらの「タイムスタンプ」は、エポックから strftime() までの秒数ではありません 年、月などの間に区切り文字がない日付と時刻だけです。時間関数を使用するのではなく、単純なテキスト操作が必要です。

gensub() に GNU awk (既に使用している) を使用する場合:

$ awk 'BEGIN{FS=OFS="|"} {$4=gensub(/(.{4})(..)(..)(..)(..)(..)/,"\\1-\\2-\\3 \\4:\\5:\\6",1,$4)} 1' file
John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

または任意の awk:

$ awk 'BEGIN{FS=OFS="|"} {$4=sprintf("%s-%s-%s %s:%s:%s", substr($4,1,4), substr($4,5,2), substr($4,7,2), substr($4,9,2), substr($4,11,2), substr($4,13,2))} 1' file
John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

前提:変更されるフィールドは、正確に 14 桁を含む唯一または最初のフィールドです。

sed -E 's=\|([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\|=|\1-\2-\3 \4:\5:\6|='

$4 のため失敗しました UNIX エポック時間である必要があります (1970 年からの秒単位の時間)、GNU Awk マニュアルの文書として。


strftime を使用する場合 のような方法であれば、対応する strptime も提供する Miller を考慮することができます。 例

$ mlr --nidx --fs '|' put -S '
    $4 = strftime(strptime($4,"%Y%m%d%H%M%S"),"%Y-%m-%d %H:%M:%S")
  ' file
John|Doe|TEST|2021-07-28 12:08:21
John|Davis|TEST|2021-08-28 12:08:21
John|Smith|TEST|2021-05-28 12:08:21

Linux
  1. 5 Linux Touch コマンドの例 (ファイルのタイムスタンプを変更する方法)

  2. パイプでティーを使用しているときにstderrをファイルに書き込むにはどうすればよいですか?

  3. サブプロセス呼び出しをテキスト ファイルにパイプするにはどうすればよいですか?

  1. BASH で mv を使用してファイル名にタイムスタンプを追加する

  2. タブ区切りファイルにヘッダーを追加する

  3. パイプは一時ファイルを書き込む必要がありますか?

  1. パイプを使用してvimでファイルを開く方法

  2. ファイルのタイムスタンプ、変更時刻、作成時刻

  3. cp -L 対 cp -H