【问题标题】:why could windows file affect some awk functions but others not [duplicate]为什么 Windows 文件会影响某些 awk 功能而其他不会影响 [重复]
【发布时间】:2018-01-26 00:51:11
【问题描述】:

我有一个文件如下

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

我想输出那些第一列不等于第二列的行,所以我用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 功能而其他不会呢?例如

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

I-MB I-MB

【问题讨论】:

    标签: awk


    【解决方案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 用于多字符 RS),那么 $0 将是:

    N N
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多