Linux awk中非常奇怪的行为
我在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
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上。