使用外部 shell 命令处理每两行后合并它们

使用外部 shell 命令处理每两行后合并它们

我有一个具有以下结构的文件:

#1552342335
ls
#1552342359
date
#1552342380
cat .bash_history 

即时间戳后跟文本行。我想使用 shell 的date(类似于date -d ${1/\#/@} '+%F %T')处理每个时间戳行,将其与下一行合并并用表标签包装,即输出如下:

<tr> <td>2019-03-11 18:12:15</td> <td><pre>ls</pre></td> </tr>
<tr> <td>2019-03-11 18:12:39</td> <td><pre>date</pre></td> </tr>
<tr> <td>2019-03-11 18:13:00</td> <td><pre>cat .bash_history</pre></td> </tr>

我知道它会是这样的awk 'NR % 2 {print | " <something here>" } !(NR % 2) {p=$0}' input_file- 但我找不到在一个命令中实现所有必要转换的方法。

答案1

通过 GNU Awk ( gawk),您可以使用内置的strftime

gawk '
    NR%2 {ts = strftime("%F %T",substr($0,2)); next} 
         {printf("<tr> <td>%s</td> <td><pre>%s</pre></td> </tr>\n",ts,$0)}
' input_file 
<tr> <td>2019-03-11 18:12:15</td> <td><pre>ls</pre></td> </tr>
<tr> <td>2019-03-11 18:12:39</td> <td><pre>date</pre></td> </tr>
<tr> <td>2019-03-11 18:13:00</td> <td><pre>cat .bash_history </pre></td> </tr>

答案2

请注意以下代码缺乏错误处理。解释通过内嵌注释的方式嵌入

awk '{

    #strip leading "#", run through date and read into $0
    gsub(/^#/, ""); "date -d @"$0" \"+%F %T\"" | getline; 
    #wrap with table tags and print
    printf "<tr> <td>%s</td>", $0;
    #read the subsequent "non-date" line
    getline;
    #wrap with table tags and print
    printf " <td><pre>%s</pre></td> </tr>\n", $0

}' file

相关内容