我有一个简单的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
,在这种情况下,输出应该是//
,而是最终为
/
/
答案 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); ...}'