2011-06-09 51 views
1

不確定最有效的方法來做到這一點。 Bash似乎是最簡單的,我有一個開始的日期。轉換文本文件的列

set -A mAMon N/A Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
sed -e 's/-/ /g' -e 's/\(.*:..\).\{4\}/\1/' -e 's/\.\([0-9]\)/ \1/g' -e 's/\./ /2' inp_file 

我已經figiured瞭如何提取列,但不知道如何轉換

這是我...

代碼:

NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com 

這是什麼我需要....更改日期,刪除mil秒,刪除ips中的句點,並刪除url中的最後一個句點。

代碼:

NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 

感謝

+0

這將是'awk',而不是'sed'工作! – Caleb 2011-06-09 11:04:27

回答

2

一個Perl方式做到這一點:

my %months = (Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6, Jul=>7, Aug=>8, Sep=>9, Oct=>10, Nov=>11, Dec=>12); 
while(<DATA>) { 
    my @part = split; 
    $part[1] =~ s/(\d+)-(\w+)-(\d+)/"$3-".sprintf('%02d',$months{$2})."-$1"/e; 
    $part[2] =~ s/\.\d+$//; 
    $part[3] =~ s/\./ /g; 
    $part[4] =~ s/\.(\w+)$/ $1/; 
    print "@part\n"; 
} 

__DATA__ 
NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com 

輸出:

NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 
2

用awk:

更新

BEGIN { 
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " ") 
    for (i=1; i<=12; i++) { 
     mdigit[month[i]] = sprintf("%02d", i) 
    } 
} 
{ 
#convert date 
    split($2, d, "-") 
    $2 = d[3] "-" d[2] "-" d[1] 
    sub(/[a-zA-Z]+/,mdigit[d[2]],$2) 

# convert time 
    split($3, t, ".") 
    $3=t[1] 

# ip 
    gsub(/\./, " ", $4) 

#url 
    sub(/\./,"_", $5) 
    sub(/\./," ",$5) 
    sub(/_/,".",$5) 

#glue everything together 
    print $1,$2,$3,$4,$5 
} 

產量:

$ awk -f date.awk input 
NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 
+0

這也適用,只是無法弄清楚如何反轉日期,例如2011-06-04。 – mrlayance 2011-06-09 13:30:03

+0

@mrlayance更新,錯過了那部分,對不起! – 2011-06-09 13:41:55

2

PURE bash4方式:

declare -A mon=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 [Jul]=07 [Aug]=08 [Sep]=09 [Oct]=10 [Nov]=11 [Dec]=12) 
while read txt date time ip host 
do 
     IFS='-' read -ra xdate <<< "$date" 
     echo $txt ${xdate[2]}-${mon[${xdate[1]}]}-${xdate[0]} ${time%%.*} ${ip//./ } ${host%.*} ${host##*.} 
done 

所以,例如

declare -A mon=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 [Jul]=07 [Aug]=08 [Sep]=09 [Oct]=10 [Nov]=11 [Dec]=12) 
while read txt date time ip host 
do 
     IFS='-' read -ra xdate <<< "$date" 
     echo $txt ${xdate[2]}-${mon[${xdate[1]}]}-${xdate[0]} ${time%%.*} ${ip//./ } ${host%.*} ${host##*.} 
done <<EOF 
NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com 
NEWDNS 05-Jul-2012 07:00:59.862 11.220.136.217 crx.verisign.sm 
EOF 

會產生:

NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 
NEWDNS 2012-07-05 07:00:59 11 220 136 217 crx.verisign sm