外部シェルコマンドを使用して2行ごとに処理してマージします。

外部シェルコマンドを使用して2行ごとに処理してマージします。

次の構造のファイルがあります。

#1552342335
ls
#1552342359
date
#1552342380
cat .bash_history 

つまり、タイムスタンプの後にテキスト行が続きます。シェル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>

私はこれがこのようになることを知っていますが、1つ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

関連情報