为什么Windows文件会影响某些awk函数,但其​​他函数却没有

时间:2017-08-17 14:30:46

标签: awk

我有一个文件如下

cat foo.txt
N N
N N
N N
N N
I-MB I-MB

我想输出第1列不等于第2列的那些行,所以我使用awk来实现它

cat foo.txt | awk '$1 != $2'
N N
N N
N N

但非常奇怪,它不起作用。

原因是它是由windows生成的

file foo.txt
foo.txt: ASCII text, with CRLF, LF line terminators

将其转换为unix形式后,它可以正常工作。

sed -e 's/^M$//' foo.txt > foo2.txt
file foo2.txt
foo2.txt: ASCII text

那么为什么CRLF会影响某些awk函数呢? e.g。

head foo.txt | awk '$1 !~ /N/'
I-MB I-MB

I-MB I-MB

1 个答案:

答案 0 :(得分:1)

所有awk功能完全不受影响,它们完全按照设计工作。您缺少的一点是,当您的输入行为(CR = \r且LF = \n)时:

N N\r\n

并且您的RS值是UNIX默认值\n,在awk中处理的$0字符串是:

N N\r

所以$ 2(N\r)不等于$ 1(N)。

如果你设置RS="\r\n"(gawk-only for multi-char RS),那么$0将是:

N N

然后显然$ 2等于$ 1,但通常的建议是在输入任何UNIX工具之前在输入文件上运行dos2unix或类似的东西。