gpt4 book ai didi

Linux 按行数拆分文本文件,保留换行符

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:15 27 4
gpt4 key购买 nike

我是 linux 的新手(不是我自己的服务器),我想通过从第三方应用程序调用 bash 脚本来拆分一些 windows txt 文件:

到目前为止,我在某种程度上以两种方式工作:

split -l 5000 LargeFile.txt SmallFile

for file in LargeFile.*
do
mv "$file" "$file.txt"
done

awk '{filename = "wrd." int((NR-1)/5000) ".txt"; print >> filename}' LargeFile.txt

但两者都给我 txt 文件,结果是:

1行2行3行4

我找到了一些关于像这样放置 LargeFile.txt $ (LargeFile.txt) 的主题,但它对我不起作用。 (我还找到了一个swich,让split命令直接生成txt文件,但这也行不通)

我希望有人能帮我解决这个问题。

最佳答案

解释:行终止符

正如对 this question 的各种回答所解释的那样,标准行终止符在操作系统之间不同:

  • Linux 使用LF(换行,0x0a)
  • Windows 使用CRLF(回车换行0x0d 0x0a)
  • Mac,OS X 之前使用 CR(回车 CR)

要解决您的问题,重要的是要弄清楚 LargeFile.txt 使用的行终止符。最简单的方法是 file 命令:

file LargeFile.txt

输出将指示行终止符是 CR 还是 CRLF,否则只是说明它是一个 ASCII 文件。

因为 LFCRLF 行终止符将在 Linux 中被正确识别,并且行不应该出现合并在一起(无论您使用哪种方式查看文件),除非您专门配置一个编辑器以便他们这样做,我将假设您的文件具有 CR 行终止符。

您的问题的示例解决方案(假设 CR 行终止符)

如果你想在 shell 中使用 shell 命令拆分文件,你可能会遇到 catsplitawk 这样的问题 等首先不会识别行结尾。如果您的文件非常大,这可能还会导致内存问题 (?)。

因此,处理此问题的最佳方法可能是首先转换行终止符(使用 tr 命令),以便它们在 Linux 中被理解(即转换为 LF ),然后在将行终止符翻译回来之前应用您的 splitawk 代码(如果您认为需要这样做)。

cat LargeFile.txt | tr "\r" "\n" > temporary_file.txt
split -l 5000 temporary_file.txt SmallFile
rm temporary_file.txt
for file in `ls SmallFile*`; do filex=$file.txt; cat $file | tr "\n" "\r" > $filex; rm $file; done

注意最后一行实际上是一个for循环:

for file in `ls SmallFile*` 
do
filex=$file.txt
cat $file | tr "\n" "\r" > $filex
rm $file
done

这个循环将再次使用 tr 来恢复 CR 行终止符,并另外给生成的文件一个 txt 文件名结尾。

一些说明

当然,如果您想保留 LF 行终止符,则不应执行此行。

最后,如果您发现您有不同类型的行终止符,您可能需要调整第一行中的 tr 命令。

trsplit(还有catrm)都是GNU coreutils 的一部分并且应该安装在您的系统上,除非您处于非常不典型的环境中(也许是初始 RAM 磁盘的救援外壳)。 file 命令也是如此(通常应该可用),this one .

关于Linux 按行数拆分文本文件,保留换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com