“头”只打印一行?

Ric*_*ard 2 grep text-processing head

我有一个通过从 Excel 保存为 CSV 生成的 CSV 文件。如果我执行“head”(或者确实是“grep”或其他任何操作),它只会打印第一行:

head -n 10 messy.csv
10,15,11,21
Run Code Online (Sandbox Code Playgroud)

但是如果我在文本编辑器或 Excel 中打开文件,它有很多行:

10,15,11,21
9,11,17,19
7,11,24,18
... 
Run Code Online (Sandbox Code Playgroud)

head 在机器上的其他文件上工作得很好。

为什么是这样?(我怀疑这与行尾有关,但我不知道是什么。)我该如何解决?

mjt*_*ner 5

我认为这与行尾有关。Excel 将保存带有回车/换行结尾的文件,但head只需要换行。

此显示什么输出: tr -d '\r' < messy.csv | head -10

如果它正确显示了 10 行,那就是你的答案。

file可以告诉您某些文本文件的行结尾(它会打印...,带有 CRLF 行终止符),但它不会对所有文本文件都这样做(我相信如果它将文件识别为是别的东西,例如 HTML)。


Pet*_*r.O 5

只能\\r 作为第 2 行以后的行尾字符(至少到第 10 行)。第 1 行有\\n作为行结束符。例如。

\n\n
printf 'ABC\\nXYZ\\r123\\r' | head\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出(到屏幕)

\n\n
ABC\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是与终端输出相关的显示工件。返回\\r到行的开头,下一行将覆盖它,最后一行将被终端提示符完全或部分覆盖 \xe2\x80\x93 。

\n\n

当最后一个\\r分隔行比提示符长时,该行将部分显示(超出提示符末尾) \xe2\x80\x93 例如,在以下示例输出中,终端提示符仅为nn $(5 个字符),其中nn是发出的第 n 个命令)。

\n\n
72 $ printf 'ABC\\nXYZ\\rabcdefghijklmnop\\r' \nABC\n73 $ fghijklmnop\n
Run Code Online (Sandbox Code Playgroud)\n\n

要解决这个问题

\n\n
sed -i.bak 's/\\r$//; s/\\r/\\n/g' file\n
Run Code Online (Sandbox Code Playgroud)\n\n

-i.bak选项导致输入file被在线更新进行备份file.bak。如果您不想备份,只需使用-i.

\n