我有一个文件如下
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
答案 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或类似的东西。