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
在机器上的其他文件上工作得很好。
为什么是这样?(我怀疑这与行尾有关,但我不知道是什么。)我该如何解决?
我认为这与行尾有关。Excel 将保存带有回车/换行结尾的文件,但head
只需要换行。
此显示什么输出:
tr -d '\r' < messy.csv | head -10
如果它正确显示了 10 行,那就是你的答案。
file
可以告诉您某些文本文件的行结尾(它会打印...,带有 CRLF 行终止符),但它不会对所有文本文件都这样做(我相信如果它将文件识别为是别的东西,例如 HTML)。
只能\\r
作为第 2 行以后的行尾字符(至少到第 10 行)。第 1 行有\\n
作为行结束符。例如。
printf 'ABC\\nXYZ\\r123\\r' | head\n
Run Code Online (Sandbox Code Playgroud)\n\n输出(到屏幕)
\n\nABC\n
Run Code Online (Sandbox Code Playgroud)\n\n这是与终端输出相关的显示工件。返回\\r
到行的开头,下一行将覆盖它,最后一行将被终端提示符完全或部分覆盖 \xe2\x80\x93 。
当最后一个\\r
分隔行比提示符长时,该行将部分显示(超出提示符末尾) \xe2\x80\x93 例如,在以下示例输出中,终端提示符仅为nn $
(5 个字符),其中nn
是发出的第 n 个命令)。
72 $ printf 'ABC\\nXYZ\\rabcdefghijklmnop\\r' \nABC\n73 $ fghijklmnop\n
Run Code Online (Sandbox Code Playgroud)\n\n要解决这个问题
\n\nsed -i.bak 's/\\r$//; s/\\r/\\n/g' file\n
Run Code Online (Sandbox Code Playgroud)\n\n该-i.bak
选项导致输入file
被在线更新并进行备份file.bak
。如果您不想备份,只需使用-i
.