在Linux和mingw64上带有CRLF行尾的不同awk结果

时间:2019-03-08 05:12:59

标签: awk mingw mingw-w64

在Linux上:

library(tidyverse)

plots = df %>%
    group_by(a) %>%
    mutate(deg_free = MASS::fitdistr(b, "t")$estimate["df"]) %>%
    # This second group_by is just used to keep the deg_free value
    # in the final dataframe, could be removed
    group_by(a, deg_free) %>%
    do(
        plot = ggplot(data=., aes(sample=b)) + 
            geom_qq(distribution = qt, dparams = list(.$deg_free)) + 
            geom_qq_line(distribution = qt, dparams = list(.$deg_free)) +
            ggtitle(.$a)
    )

# Using map to unpack the list-column into a list, there's
#   probably a better way
cowplot::plot_grid(plotlist=map(plots$plot,  ~ .))

返回期望值

echo -n $'boo\r\nboo\r\n' | awk $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v

但是,在mingw64(适用于Windows的git bash)上,该命令返回:

foo^M
foo^M

没有回车。

我尝试显式设置记录分隔符,因为也许两个平台之间的默认分隔符不同,但是mingw64上的awk仍在咀嚼回车。如何使Awk在mingw64的Linux上做同样的事情?请注意,awk版本略有不同(Linux上的GNU Awk 4.0.2和mingw64上的GNU Awk 4.2.1),但是除非有某种错误,否则我认为这并不重要。

请注意,由于在mingw64上这是在awk中专门发生的事情:

foo
foo

返回期望值:

echo -n $'boo\r\nboo\r\n' | cat -v

1 个答案:

答案 0 :(得分:1)

搜索了一段时间后,我发现了this question,并且从this answer中找到了:

  

这是由C库完成的,要阻止它发生,您应该将awk BINMODE变量设置为3

我将您的代码更改为:

echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v

并在Unix,Linux,MacOS和Windows上进行了尝试,均产生以下输出:

foo^M
foo^M

您正在寻找-v BINMODE=3
注意,只有-v BINMODE=3此开关和代码才能正常工作。
通常,我们可以通过-v块中的BEGIN开关将变量传递给awk,或者在文件之前的代码之后设置它,
但是在这种情况下,我尝试了三种方式,只有-v BINMODE=3有效。
猜猜这与awk的编译过程有关。

示例(在Windows上为cygwin下):

$ echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 '1' | cat -v    
boo^M                                                          
boo^M                                                          

$ echo -n $'boo\r\nboo\r\n' | awk 'BEGIN{BINMODE=3}1' | cat -v 
boo                                                            
boo                                                            

$ echo -n $'boo\r\nboo\r\n' | awk '1' BINMODE=3 | cat -v       
boo                                                            
boo                  

在其他提到的平台下,它们都产生:

boo^M
boo^M