2017-07-12 109 views
1

我想awk一個數據文件列表。所有記錄 - 之前 - 之前存在未知數量的記錄,例如,awk:重新格式化數據文件列表中的日期(批量編輯)

/10-12-2014 06:47:59/{p=1} 

將被跳過。

一個數據文件的簡要模板看起來像這樣:

data_file_001

0; n records to be skipped 
1;10-12-2014 06:47:59; 
2;12-12-2014 10:17:44; 
3;12-12-2014 10:37:44; 
4;14-12-2014 10:00:32; 
5;;movefield 
6;16-12-2014 04:15:39; 

所需輸出($ 2的DateField重新格式化和$ 3都移動到4 $):

colnum;date;col3;col4;col5 
2;12.12.14;; 
3;12.12.14;; 
4;14.12.14;; 
5;;;movefield;moved 
6;16.12.14;; 

我的源文件目前是這樣:

BEGIN { OFS=FS=";" ; print "colnum;date;col3;col4;col5"} 
FNR == 1 { p=0 } 

$3 == "movefield" { $4 = $3; $5 = "moved"; $3 = ""} 
    #(x=index($2," ") > 0) {DDMMYY = substr($2,1,x-1)} 
$2=substr($2,1,11) 

p!=0{print}; 
/10-12-2014 06:47:59/{p=1} 

我有問題重新格式化數據字段:pattern-action(x = index($ 2,「」)> 0){DDMMYY = substr($ 2,1,x-1)}不起作用,$ 2 = substr( $ 2,1,11)與移動場行動相結合。注意移動字段出現的記錄沒有日期字段。

請記住,awk是用於一堆文件(循環)。

回答

2

隨着GNU AWK爲implace編輯,無需循環:

awk -i inplace ' 
    BEGIN { OFS=FS=";" ; print "colnum","date","col3","col4","col5" } 
    FNR==1 { next } 
    $3 == "movefield" { $4 = $3; $5 = "moved"; $3 = ""; print; next } 
    { sub(/ .*/,"",$2); gsub(/-/,".",$2); print $0, ""} 
' file* 
+0

精彩!你也喜歡 - 進入。在日期欄中。我忘了提及這一點,而我在'循環'嘗試中遇到了問題。我不知道就地'功能',並將不得不在手冊中查找它。 FNR需要改進== 1 {next}我認爲。我有循環,因爲在我需要處理之前,數據文件中有未知數量的記錄。例如,我給出了某些日期/ 10-12-2014 06:47:59/{p = 1} – colt

+0

因此,「2014年10月12日06:47:59」之前的所有記錄都需要跳過。 – colt

+0

我無法使用上面的代碼。我使用gawk和Windows shell。我不知道如何按照給定的方式輸入程序代碼。看來我必須像使用手冊一樣使用它:awk -f program.awk文件* .csv但是我不知道如何用-i inplace調用它。它給了我錯誤。 – colt

1

另在GNU AWK:

$ awk ' 
function refmt(str) {     # reformat date for comparing 
    split(str,d,"[ :-]") 
    return mktime(d[3] " " d[2] " " d[1] " " d[4] " " d[5] " " d[6]) 
} 
BEGIN { 
    FS=OFS=";" 
    start=refmt("10-12-2014 06:47:59") # reformat the threshold date 
    print "colnum","date","col3","col4" # print header (why 5?) 
} 
refmt($2)>start || $2=="" {    # if date > start or empty 
    sub(/ .*/,"",$2)     # delete time part 
    gsub(/-/,".",$2)     # replace - by . 
    $4=$3; $3=""      # or $3 = OFS $3 
    print        # output 
}' file 
colnum;date;col3;col4 
2;12.12.2014;; 
3;12.12.2014;; 
4;14.12.2014;; 
5;;;movefield 
6;16.12.2014;; 
+0

布朗先生,我通過這種方式重新格式化了日期字段。它甚至在處理一堆數據文件。在我運行第二個awk程序之前,這就是現在的階段。 – colt

+0

不錯。第二節目是什麼? –

+0

謝謝你的提問。我仍然在寫它。有很多重組工作要做。當然,只有一個節目是很好的,但是現在我花了整整一天的時間,我明天就會去參加第二個節目。後來我可以把它放在這裏.. – colt