打印时文字顺序混乱

打印时文字顺序混乱

我们运行一个自动化过程来更改文件中的数据结构,并且它已经运行了大约一年,没有出现任何问题。它刚刚开始失败,我已将问题范围缩小到文件中的日期字段之一。问题开始之前和之后的文件看起来相同,但确实发生了一些事情。如果我尝试将文件与其他文本一起打印到屏幕上,则会弄乱顺序。我在文件中找不到任何隐藏字符,尽管我怀疑一定有一个。有人以前见过这个吗?

这是一个例子。我删除了文件中除可疑字段之外的所有内容,并将旧文件与新文件进行比较:

$ cat old.file
16-JUN-2015
15-JUN-2015
$ cat old.file | awk '{print "a" $1 "b"}'
a16-JUN-2015b
a15-JUN-2015b
$ for line in `cat old.file`;do echo "a${line}b";done
a16-JUN-2015b
a15-JUN-2015b
$
$
$ cat new.file
23-JUN-2015
16-JUN-2015
$ cat new.file | awk '{print "a" $1 "b"}'
b23-JUN-2015
b16-JUN-2015
$ for line in `cat new.file`;do echo "a${line}b";done
b23-JUN-2015
b16-JUN-2015

我正在运行 Red Hat EL Server。谢谢,

答案1

你以某种方式得到了 Windows 风格的行结尾,即CRLF \x0D\xOA \r\n......

printf 'xyz\r\n' >file; cat file | awk '{print "a" $1 "b"}'

输出bxyz


cat file | sed -n l 

输出xyz\r$-$指示行尾


您可以从一对中过滤掉任何多余的\rs\r\nawk

cat file | awk -vRS='\r?\n' 1 | sed -n l

输出xyz$


要纠正该问题:

cat file | awk -vRS='\r?\n' 1 > file.fixed

为什么会有这种行为?

cat file输出显示在终端上时,回车键\r(Carriage-Return) 会执行其预期执行的操作。返回马车完全向左。对于终端,这意味着文本插入点移动到屏幕的左边缘 - 该术语和概念\r源自手动打字机时代,当时运输曾是到左边距(通过手动操作杆),一旦到达左边距,滚筒会将纸张向下推进 1 行,即美联储论文 1线

在终端中,因为有bafter \r,所以会覆盖先前放置在第 1 列中的b内容。a

答案2

这可能是一个new-linevscariage-return问题。我认为新文件只有回车^M符而不是换行符。尝试file /path/to/new.file看看是否返回ASCII text, with CR line terminators

在您的情况下,a打印后跟有^M行终止符的输入行,告诉先进入行的开头,然后打印b

答案3

新文件中的回车符 (^M) 而不是行尾的换行符 (^J)。尝试使用 cat -v new.file 并使用 hd 查看该文件。

您可以使用 sed 删除无关的回车符,如下所示:

sed 's/\r//' 新文件

相关内容