Unix で txt を xls に編集するにはどうすればいいですか?

Unix で txt を xls に編集するにはどうすればいいですか?

txt ファイルを xls/csv に変換したいです。

最初の行には日時が出力され、2 行目には残りのすべてのデータ (以下の例では tid からテーブルまで) が出力されます。

以下のコマンドを使用すると

awk 'BEGIN{ OFS="\t"; print "DateTime,Error"}; NR > 1{print $1,$2;}' TMP.txt > Output.xls

最初の行には datetime が印刷されますが、次の列には 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$2tid:

sedあなたの場合、最も簡単な方法は、初めタブで空白を消すと、目的の結果が得られる可能性があります。

ヘッダー行も含めたいので、次のコードが機能するはずです (GNUsedが使用されていると仮定)。

sed -e '1 i\DateTime\tError' -e 's/ /\t/' TMP.txt > Output.txt

最初の式は行の先頭に 1 行のテキストを挿入し、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 つ以上のスペース、行末までの任意の印刷可能文字に一致し、最初の(...)サブグループ、タイムスタンプ、\t、そして 2 番目の(...)サブグループ (「行の残り」) を印刷します。さらに、BEGINアンカーを使用して、上部にヘッダー行を挿入します。

両方のケースが同じファイル内で発生する可能性があるため、これらを 1 つの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

もちろん、これにより、出力に異なるタイムスタンプ形式が保持されることに注意してください。これを統一された形式に変換する場合は、シェル スクリプトを使用する必要がある場合があります。

関連情報