Linux awk中非常奇怪的行为

Linux awk中非常奇怪的行为,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我在awk遇到了非常奇怪的行为 输入文件如下所示: ABCD Yes EFGH Yes /^ / { print "ss", $2, "dd\n" } ss Yes dd ss Yes dd ddYes ddYes 我的awk

我在awk遇到了非常奇怪的行为

输入文件如下所示:

               ABCD                                        Yes
               EFGH                                        Yes
/^              / {
        print "ss", $2, "dd\n"
}
ss Yes dd

ss Yes dd
 ddYes

 ddYes
我的awk脚本如下所示:

               ABCD                                        Yes
               EFGH                                        Yes
/^              / {
        print "ss", $2, "dd\n"
}
ss Yes dd

ss Yes dd
 ddYes

 ddYes
我期待的是:

               ABCD                                        Yes
               EFGH                                        Yes
/^              / {
        print "ss", $2, "dd\n"
}
ss Yes dd

ss Yes dd
 ddYes

 ddYes
但令人惊讶的是,结果如下:

               ABCD                                        Yes
               EFGH                                        Yes
/^              / {
        print "ss", $2, "dd\n"
}
ss Yes dd

ss Yes dd
 ddYes

 ddYes

我的“ss”在哪里?为什么会在“dd”后面附加“是”?

输入文件有DOS换行符。每行末尾的
\r
字符作为
$2
的一部分获得输出,并将插入点重置为行的开头,然后在该点打印出
dd
的空格,覆盖初始的
ss
。(您可以修改
ss
前缀或
dd
后缀长度,以便更清楚地看到这一点。)

从原始文件中删除这些内容,这将消失

awk '{print "ss", $2, "dd\n"}' f2

f2
是输入文件,它对我来说工作正常

无法重现。OFS的值是多少?您的文件有DOS换行符。这是
\r
将插入重置为行首。更改
ss
前缀长度或
dd
后缀长度,您将看到它。谢谢!就是这样:-)你的命令对我来说很好。我在GNU Awk 3.1.8上。