相关文章推荐
气势凌人的稀饭  ·  Java ...·  1 年前    · 
爱运动的青椒  ·  Spring ...·  1 年前    · 

cat没有换行:为什么tr '\n'不工作?

0 人关注

我生成了1000个包含单行的输出文件,(错误地)最后没有换行,所以

cat filnename_* > outfile

生成了一个只有一行的文件。我试图用以下方法来解决这个问题

cat filename_* | tr '\n' ' ' > outfile

但我得到的结果完全一样--一个只有一行输出的文件。为什么后者的代码(应该为每个filename_*文件添加一个换行符)不能实现我想做的事情?

5 个评论
Max
是否有一些直接的方法在cat中的每一行(文件)的末尾引入一个'/n',这样我就能得到一个每行有1000行的输出文件?
Max
有办法在猫内做到这一点吗?
我唯一能想到的是一个自定义函数;见我答案的后半部分
你可以在命令行上的文件名中穿插一个名字,当读取时,只返回一个新行。这对你的目的来说是 "猫内 "吗?
明确地说,如果你的输入文件是有效的UNIX文本格式,就不需要这些了,因为UNIX中的所有行都是 including 最后一个文件需要有训练有素的换行符,才能被视为标准的文本。因此, cat 没有理由为此包括特殊的功能;如果它的输入形式正确,问题就不会发生。
linux
bash
Max
Max
发布于 2022-07-25
3 个回答
ramsay
ramsay
发布于 2022-07-25
已采纳
0 人赞同

我想你可以在你的1000个出来的文件中手动附加一个换行符,然后再把它们全部 cat

echo | tee -a filename_*
cat filnename_* > outfile
按照@rowboat的建议,将第一步改为echo | tee -a filename_*

echo 发出一个没有任何参数的单行断句调用。如果你幸运的话, echo -e '\n' 会发出两个,如果你不幸运的话,会发出字符串 -e ,后面是一个空格,然后是换行。(请阅读POSIX规范中关于 echo 的应用用途部分以了解情况;bash有几种不同的方法,可以在编译时或运行时配置echo的副本,使其符合该标准。)
Fravadona
Fravadona
发布于 2022-07-25
0 人赞同

如果你的所有文件都缺少最后的换行符,那么你可以使用 sed 来即时添加它。

# with GNU sed
sed '$s/$/\n/' filnename_* > outfile
# with standard sed and bash, zsh, etc...
sed $'$s/$/\\\n/' filnename_* > outfile
# with standard sed and a POSIX shell
sed '$s/$/\
/' filnename_* > outfile
    
markp-fuso
markp-fuso
发布于 2022-07-25
0 人赞同

替换代码0】说的是用空格替换每个 \n ;你已经说过输入不包含任何 \n ,所以 tr 没有任何作用,最终的输出只是输入的一个拷贝。

Setup:

for ((i=1;i<=5;i++))
    printf 'abcd' > out${i}
$ cat out*
abcdabcdabcdabcdabcd

许多命令可以处理一个文件并添加一个\n,这只是取决于你想做多少输入,例如。

$ sed 's/$/&/' out*      # or: sed -n '/$/p' out*
$ awk '1' out*

我没有想到如何使用cat来追加\n,但有一个想法是使用一个用户定义的函数。假设我们想把我们的新函数命名为catncat并在最后添加\n)。

$ type -a catn                           # verify name "catn" not currently in use
-bash: type: catn: not found
$ catn() { awk '1' "${@:--}"; }          # wrap function definition around the awk solution
$ catn out*