我们运行一个自动化过程来更改文件中的数据结构,并且它已经运行了大约一年,没有出现任何问题。它刚刚开始失败,我已将问题范围缩小到文件中的日期字段之一。问题开始之前和之后的文件看起来相同,但确实发生了一些事情。如果我尝试将文件与其他文本一起打印到屏幕上,则会弄乱顺序。我在文件中找不到任何隐藏字符,尽管我怀疑一定有一个。有人以前见过这个吗?
这是一个例子。我删除了文件中除可疑字段之外的所有内容,并将旧文件与新文件进行比较:
$ 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$
-$
指示行尾
您可以从一对中过滤掉任何多余的\r
s\r\n
awk
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线。
在终端中,因为有b
after \r
,所以会覆盖先前放置在第 1 列中的b
内容。a
答案2
这可能是一个new-line
vscariage-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//' 新文件