次の構造のファイルがあります。
#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