2017-04-09 81 views
4

我有一個簡單的awk命令,可以將日期從MM/DD/YYYY轉換爲YYYY/MM/DD。但是,我使用的文件在行尾有\ r \ n,有時日期在行尾。在awk中刪除 r n

awk ' 
    BEGIN { FS = OFS = "|" } 
    { 
    split($27, date, /\//) 
    $27 = date[3] "/" date[1] "/" date[2] 

    print $0 
    } 
' file.txt 

在這種情況下,如果日期是MM/DD/YYYY\r\n然後我結束了這個輸出:

YYYY 
/MM/DD 

什麼是解決這個問題的最好方法是什麼?請記住,有時輸入是簡單\r\n在這種情況下,輸出應爲//,而是最終成爲

/ 
/
+0

爲什麼不使用'date [3]'中的一個替換函數''用''「'替換'\ r'? –

回答

6

鑑於\r並不總是在現場$27末,最簡單的方法是從整行中刪除\r

隨着GNU awk中Mawk(其中一個是典型的Linux平臺上的默認awk),你可以簡單地定義你的輸入記錄分隔符,RS,因此:

awk -v RS='\r\n' ... 

或者,如果你想\r\n - 終止輸出行也設置輸出記錄分隔符ORS,以相同的值:

awk 'BEGIN { RS=ORS="\r\n"; ... 

可選讀數:一個預留BSD/MACOS awk中用戶:

BSD/MACOS awk不支持多字符RS值(符合POSIX Awk spec:「如果RS包含多個字符,結果未指定「)。

因此,sub呼叫awk腳本內是必要的,以從每個輸入行的末尾修剪\r實例:

awk '{ sub("\r$", ""); ... 

爲了也輸出\r\n封端的線,選項-v ORS='\r\n'(或ORS="\r\n"在腳本的BEGIN塊內)將會正常工作,就像GNU Awk和Mawk一樣。

+1

完美。謝謝! – richie

0

如果您使用的是\n本身就是換行符的系統,則應該從記錄中刪除\r。你可以這樣做:

$ awk '{sub(/\r/,"",$NF); ...}'