1

次のようなファイルがあります。

----------------------------------------
#Timestamp: 4/11/2013 12:00:48 AM
#Title: MDS error
#Category: Errors

----------------------------------------
#Timestamp: 4/11/2013 12:03:27 AM
#Title: MDS error
#Category: Errors

----------------------------------------
#Timestamp: 4/11/2013 12:05:39 AM
#Title: MDS error
#Category: Errors

----------------------------------------

次のようなCSVファイルに変換する必要があります。

4/11/2013 12:00:48 AM,MDS error,Errors
4/11/2013 12:03:27 AM,MDS error,Errors
4/11/2013 12:05:39 AM,MDS error,Errors

コマンドライン (awk/sed) として何かを行う必要がありますか? このような一連のファイルを CSV に変換する必要があるためです。

4

7 に答える 7

5
awk -F: '/^#Timestamp/{line=$2","}/^#Title/{line=line""$2}/^#Category/{print line","$2;}' your_file

テスト済み:

> cat temp
----------------------------------------
#Timestamp: 4/11/2013 12:00:48 AM
#Title: MDS error
#Category: Errors

----------------------------------------
#Timestamp: 4/11/2013 12:03:27 AM
#Title: MDS error
#Category: Errors

----------------------------------------
#Timestamp: 4/11/2013 12:05:39 AM
#Title: MDS error
#Category: Errors

----------------------------------------
> awk -F: '/^#Timestamp/{line=$2","}/^#Title/{line=line""$2}/^#Category/{print line","$2;}' temp
 4/11/2013 12, MDS error, Errors
 4/11/2013 12, MDS error, Errors
 4/11/2013 12, MDS error, Errors

OPで問題ない場合のより短い解決策:

awk -F: '/^#/{line=line","$2}/^-/{print substr(line,3);line="";}' your_file
于 2013-04-12T07:11:19.547 に答える
1
#!/bin/bash

while true; do
    read             || break
    read _ timestamp || break
    read _ title     || break
    read _ category  || break
    read             || break

    printf '%s,%s,%s\n' "$timestamp" "$title" "$category"
done < logfile.txt
于 2013-04-11T18:44:48.483 に答える
1

これはうまくいくかもしれません(GNU sed):

sed '/^#Timestamp:/{N;N;y/\n/,/;s/#[^ ]* //gp};d' file
于 2013-04-12T00:58:36.507 に答える
0
$ awk -F": " '/^#T/{printf "%s,",$2}/^#C/{printf "%s\n",$2}' file
4/11/2013 12:00:48 AM,MDS error,Errors
4/11/2013 12:03:27 AM,MDS error,Errors
4/11/2013 12:05:39 AM,MDS error,Errors
于 2013-04-11T18:44:14.077 に答える
0

これが私のものです:

sed -ne '/----/{N;N;N;s/\n/,/g;s/[^:]*: \([^,]*,\)[^:]*: \([^,]*,\)[^:]*: \(.*\)/\1\2\3/;p;}' file

これは、破線の後に関心のある 3 つの行があることを前提としています。変数の場合、何らかのループが発生する必要があります。

于 2013-04-11T21:21:26.840 に答える
0

各レコードに含まれる行が 3 つだけであると仮定すると、入力を消去して一緒に「貼り付ける」ことができます。

<infile sed '/^---/d; /^ *$/d; s/[^:]*: *//' | paste -d, - - -

出力:

4/11/2013 12:00:48 AM,MDS error,Errors
4/11/2013 12:03:27 AM,MDS error,Errors
4/11/2013 12:05:39 AM,MDS error,Errors

可変数の行がある場合は、GNU awk (おそらく mawk も) を使用して次のようにすることができます。

<infile awk 'NF>0 {gsub("\n\n+", "\n"); gsub("\n[^:]+: *", ","); sub(",",""); print}' RS='-{40}' ORS=''

最初の置換は空行を削除し、2 番目はヘッダーをコンマに置き換え、3 番目は不要なコンマを削除します。

于 2013-04-11T21:00:11.003 に答える