在awk中删除\ r \n

ric*_*hie 5 linux awk

我有一个简单的awk命令,可以将日期从MM/DD/YYYY转换为YYYY/MM/DD.但是,我正在使用的文件在行的末尾有\ r \n,有时日期在行的末尾.

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

    print $0
  }
' file.txt
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果日期是,MM/DD/YYYY\r\n那么我在输出中结束这个:

YYYY
/MM/DD
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?请记住,有时输入只是\r\n在这种情况下输出应该是,//但最终结果为

/
/
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 8

鉴于\r并非总是在字段的末尾$27,最简单的方法是\r从整行中删除.

使用GNU AwkMawk(其中一个通常是awkLinux平台上的默认设置),您可以简单地定义输入记录分隔符RS,相应地:

awk -v RS='\r\n' ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您还想要\r\n终止输出行,请将输出记录分隔符设置ORS为相同的值:

awk 'BEGIN { RS=ORS="\r\n"; ... 
Run Code Online (Sandbox Code Playgroud)

可选阅读:对于BSD/macOS Awk用户:

BSD/macOS awk不支持多字符 RS值(符合POSIX Awk规范:"如果RS包含多个字符,则结果未指定").

因此,sub需要在Awk脚本内调用以\r从每个输入行的末尾修剪实例:

awk '{ sub("\r$", ""); ... 
Run Code Online (Sandbox Code Playgroud)

输出 \r\n -terminated行,选项-v ORS='\r\n'(或ORS="\r\n"脚本BEGIN块内)将正常工作,如GNU Awk和Mawk.