Bash 和 awk:将字段从 12 小时制转换为 24 小时制

cbr*_*008 2 bash awk

我有一个很大的 txt 文件空间,我将其分成 18 个较小的文件(每个文件都有自己的列数)。这种分割基于分隔符,即每当时间戳达到午夜时。如此有效地,我最终会得到 18 个以下形式的文件(注意,忽略破折号和管道,我使用它们来提高可读性):

文件1

time ----------- valueA - valueB  
12:00:00 AM |      54.13 | 239.12  
12:00:01 AM |      51.83 | 119.93  
..  
Run Code Online (Sandbox Code Playgroud)

文件18

time ---------- valueA - valueB - valueC - valueD  
12:00:00 AM |      54.92 | 239.12  | 231.23  | 882.12  
12:00:01 AM |      23.92 | 121.92  | 201.23  | 892.12   
..  
Run Code Online (Sandbox Code Playgroud)

分割文件后,我会使用 AWK 对每个文件执行一些处理,因此简而言之,有两个阶段:“分割阶段”和“处理阶段”。

不幸的是,大 txt 文件中包含的时间戳采用两种格式之一。理想的 24 小时格式“00:00:01”或不理想的 12 小时格式“12:00:01 AM”。

因此,我试图将所有格式转换为 24 小时,但我不知道如何执行此操作。我也不确定是否要在分割阶段使用 bash 尝试此操作,还是在进程阶段使用 AWK 尝试此操作。我知道以下函数将 12 小时转换为 24 小时

'date --date="12:00:01 AM" +%T'
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何将其合并到我的 shell 脚本中,如果我在“分割阶段”使用“while read line”,或者我是否应该在“处理阶段”在 AWK 中进行时间转换(如果可能?)阶段'。

Ken*_*ent 5

看看下面的测试,对你有帮助吗?

 kent$  echo "12:00:00 AM |      54.92 | 239.12  | 231.23  | 882.12  "\
|awk -F'|' 'BEGIN{OFS="|"}{("date --date=\""$1"\" +%T") |getline $1;print }'
Run Code Online (Sandbox Code Playgroud)

输出

 00:00:00|      54.92 | 239.12  | 231.23  | 882.12
Run Code Online (Sandbox Code Playgroud)