txtファイルをxls / csvに変換したいです。
最初の行は日付/時刻を印刷し、2行目は残りのすべてのデータを印刷する必要があります(以下の例のtidから表まで)。
m が次のコマンドを使用する場合
awk 'BEGIN{ OFS="\t"; print "DateTime,Error"}; NR > 1{print $1,$2;}' TMP.txt > Output.xls
最初の行には日付/時刻を印刷しますが、次の列にはtidのみを印刷します。
誰もが2番目の列に残っているテキストをすべて印刷するのに役立ちますか?
テキストファイルに書き込まれた:
2019-11-26T11:51:32.087-08:00 tid: JCA-work-instance:AQ Adapter-8 userId: <anonymous> 0 , APP: Service Bus Logging FlowId: 0000MtDbHiu8pmk5Szd9ic1TlVox0015xl RouteNode2, null, null, REQUEST Queried data from header table
次の種類のログエントリも考慮する必要があります。
Nov 28, 2019 8:19:03 AM PST HTTP BEA-101019 [ServletContext[text] Servlet failed with an IOException.
Nov 28, 2019 8:22:40 AM PST [null, null, null, ERROR] error in service-callouterror service to get information
ベストアンサー1
これらの動作が表示されるのは、基本的にawk
(WHITESPACE
スペース、タブなど)が入力フィールド区切り文字として扱われるためです。したがって、すべてスペースで囲まれた入力ファイルのエントリは個別の「フィールド」として扱われ、独自の$<number>
内部変数が割り当てられます。ただし、コマンドは最初の2つのフィールド(および)のみが印刷されることをawk
示します。あなたの場合は、日付/時刻文字列とリテラルです。awk
$1
$2
tid:
場合によっては、最も簡単なアプローチはsed
代替を使用することです。最初タブスペースを使用すると、目的の結果が得られます。
ヘッダー行も含めたいので、次のことがうまくいくはずです(sed
GNUを使用しているとします)。
sed -e '1 i\DateTime\tError' -e 's/ /\t/' TMP.txt > Output.txt
最初の式は行の先頭にテキスト行を挿入し、2番目の式は期待される「実際の書式設定」を実行します。
修正する
awk
あなたが提供した追加の文字列形式の場合は、次のアプローチを使用しますsed
(GNU awkを使用します)。
awk 'BEGIN{printf("DateTime\tError\n")} {match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[01]?[[:digit:]]:[012345][[:digit:]]:[012345][[:digit:]][[:space:]]+[AP]M[[:space:]]+[[:alpha:]]+)[[:space:]]+([[:print:]]*)$", fields); printf("%s\t%s\n", fields[1], fields[2])}' TMP.txt > Output.txt
この正規表現は、ユーザーが指定した時間形式と一致し、その後に1つ以上の空白、印刷可能な文字が行末まで来、最初のサブグループ、(...)
タイムスタンプ、a \t
、2番目の(...)
サブグループ、つまり「を印刷します。残りの行」。さらに、BEGIN
アンカーポイントは、上部にタイトル行を挿入するために使用されます。
両方の状況が同じファイルで発生する可能性があるため、それらを単一のawk
プログラムにまとめる必要があります。
BEGIN {
printf("DateTime\tError\n");
}
{
if (match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[012]?[[:digit:]](:[012345][[:digit:]]){2}[[:space:]]+[AP]M[[:space:]]+[[:upper:]]+)[[:space:]]+([[:print:]]*)$", fields) == 0)
match($0,"^(20[[:digit:]]{2}-[01][[:digit:]]-[0123][[:digit:]][[:alpha:]][012][[:digit:]](:[012345][[:digit:]]){2}.[[:digit:]]{3}[+-][012][[:digit:]]:[012345][[:digit:]])[[:space:]]+([[:print:]]*)$", fields);
printf("%s\t%s\n", fields[1], fields[3]);
}
上記のスクリプトを呼び出しxlsconvert.awk
てから、次のように呼び出すことができます。
user@host$ awk -f xlsconvert.awk TMP.txt > Output.txt
もちろん、これは出力で異なるタイムスタンプ形式を維持します。これを統合形式に変換するには、シェルスクリプトを使用する必要があります。