2013-04-11 36 views
1

我有文件,它看起來像以下:將多聯機日誌文件,CSV

---------------------------------------- 
#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
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 
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 
+1

如果標題或類別的詞數不同,該怎麼辦? – 2013-04-11 18:46:30

+0

@JohnKugelman很好的一點!固定。 – 2013-04-11 18:55:34

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 
0

假設每條記錄只包含三行,您可以用清潔的輸入和 「粘貼」 一起脫身:

<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='' 

第一個替換刪除空行,第二個替換用逗號替換標題,第三個刪除外部逗號。

0

這裏是我的:

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

但這假設有下面的虛線三行的興趣。如果它是可變的,則必須發生一些循環。

1

這可能會爲你工作(GNU SED):

sed '/^#Timestamp:/{N;N;y/\n/,/;s/#[^ ]* //gp};d' file 
0
awk -F ": " '!(i%3)&&i{print s;s=i=""}/#/{s=s!=""?s","$2:$2;i++}'