在awk

时间:2017-04-09 17:34:29

标签: 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

在这种情况下,如果日期为MM/DD/YYYY\r\n,那么我最终会在输出中显示:

YYYY
/MM/DD

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

/
/

2 个答案:

答案 0 :(得分:7)

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

使用 GNU Awk Mawk (其中一个通常是Linux平台上的默认awk),您只需定义输入记录分隔符{ {1}},相应地:

RS

或者,如果您也希望awk -v RS='\r\n' ... - 终止输出行,请将输出记录分隔符\r\n设置为相同的值:

ORS

可选阅读:BSD / macOS Awk用户的旁白:

BSD / macOS awk 'BEGIN { RS=ORS="\r\n"; ... 不支持多字符 awk值(符合POSIX Awk spec:" If { {1}}包含多个字符,结果未指定")。

因此,需要在Awk脚本中进行RS调用以从每个输入行的末尾修剪RS实例:

sub

要同时输出 \r - 已终止的行,选项awk '{ sub("\r$", ""); ... (或脚本\r\n块内的-v ORS='\r\n'将会工作得很好,就像GNU Awk和Mawk一样。

答案 1 :(得分:0)

如果您使用\n本身为换行符的系统,则应从记录中删除\r。你可以这样做:

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