说我有一个巨大的文本文件(> 2GB),我只是想cat
行X
至Y
(如57890000至57890010)。
据我所知,我可以通过管道head
输入tail
或反之亦然来做到这一点,即
head -A /path/to/file | tail -B
Run Code Online (Sandbox Code Playgroud)
或者
tail -C /path/to/file | head -D
Run Code Online (Sandbox Code Playgroud)
其中A
、B
、C
和D
可以根据文件中的行数计算得出,X
和Y
。
但是这种方法有两个问题:
A
,B
,C
和D
。pipe
相互发送比我感兴趣的多得多的行(例如,如果我只读取大文件中间的几行)有没有办法让 shell 只使用并输出我想要的行?(同时仅提供X
和Y
)?
我的一个巨大的(最多 2 GiB)文本文件包含其中每一行的大约 100 个精确副本(在我的情况下没用,因为该文件是一个类似 CSV 的数据表)。
我需要的是在保持原始序列顺序的同时删除所有重复(最好,但可以为了显着的性能提升而牺牲)。结果中的每一行都是唯一的。如果有 100 条相等的行(通常重复项分布在整个文件中并且不会是邻居),则只剩下一种。
我已经用 Scala 编写了一个程序(如果您不了解 Scala,请考虑使用 Java)来实现这一点。但也许有更快的 C 编写的本地工具能够更快地做到这一点?
更新:awk '!seen[$0]++' filename
只要文件接近 2 GiB 或更小,该解决方案似乎对我来说很好用,但现在我要清理 8 GiB 文件,它不再起作用。在配备 4 GiB RAM 的 Mac 和配备 4 GiB RAM 和 6 GiB 交换的 64 位 Windows 7 PC 上,似乎无穷无尽,只是内存不足。鉴于这种经验,我并不热衷于在具有 4 GiB RAM 的 Linux 上尝试它。
我有一个巨大的(70GB)一行文本文件,我想替换其中的一个字符串(令牌)。我想<unk>
用另一个虚拟令牌(手套问题)替换令牌。
我试过sed
:
sed 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new
Run Code Online (Sandbox Code Playgroud)
但输出文件corpus.txt.new
有零字节!
我也尝试过使用 perl:
perl -pe 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new
Run Code Online (Sandbox Code Playgroud)
但我遇到了内存不足错误。
对于较小的文件,上述两个命令都有效。
如何替换字符串是这样的文件? 这是一个相关的问题,但没有一个答案对我有用。
编辑:如何将文件拆分为 10GB(或其他任何大小)的块并应用sed
到其中的每一个然后将它们合并cat
?那有意义吗?有没有更优雅的解决方案?
我有一个相当大的文件(35Gb),我想就地过滤这个文件(即我没有足够的磁盘空间来存放另一个文件),特别是我想 grep 并忽略一些模式 - 有没有办法在不使用其他文件的情况下执行此操作?
假设我想过滤掉所有包含foo:
例如...
我有两个大文件(每个 6GB)。它们是未排序的,以换行符 ( \n
) 作为分隔符。我该如何区分它们?应该不到 24 小时。
我有 25GB 的文本文件,只需要在几行中替换一个字符串。我可以sed
成功使用,但需要很长时间才能运行。
sed -i 's|old text|new text|g' gigantic_file.sql
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来做到这一点?
我用 SCP 试过了,但它说“负文件大小”。
>scp matlab.iso xxx@xxx:/matlab.iso
matlab.iso: Negative file size
Run Code Online (Sandbox Code Playgroud)
还尝试使用 SFTP,工作正常,直到 2 GB 的文件传输完毕,然后停止:
sftp> put matlab.iso
Uploading matlab.iso to /home/x/matlab.iso
matlab.iso -298% 2021MB -16651.-8KB/s 00:5d
o_upload: offset < 0
Run Code Online (Sandbox Code Playgroud)
知道有什么问题吗?SCP 和 SFTP 不支持大于 2 GB 的文件吗?如果是这样,那么我如何通过 SSH 传输更大的文件?
目标文件系统是 ext4。Linux 发行版是 CentOS 6.5。文件系统当前有(可访问的)大文件(最多 100 GB)。
在为包含 flac 格式的视频和音频等大文件的分区创建文件系统时,使用-T largefile标志有用吗?
我使用该标志和不使用该标志测试了相同的分区,并使用tune2fs -l [partition],我检查了启用了“large_file”的“文件系统功能”。那么,没有必要使用-T 标志 largefile吗?
我ext4
在一个(磁性)硬盘驱动器上有一个 900GB 的分区,它没有缺陷也没有坏扇区。除了一个空lost+found
目录外,该分区完全是空的。该分区使用默认参数进行格式化,但我将保留文件系统块的数量设置为 1%。
我xubuntu-15.04-desktop-amd64.iso
使用wget
. 下载完成后,发现文件被分成了四个片段:
filefrag -v /media/emma/red/xubuntu-15.04-desktop-amd64.iso
Filesystem type is: ef53
File size of /media/emma/red/xubuntu-15.04-desktop-amd64.iso is 1009778688 (246528 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
2: 63488.. 96255: 100352.. 133119: 32768: 98304:
3: 96256.. 126975: 133120.. 163839: 30720:
4: 126976.. 159743: 165888.. 198655: 32768: 163840:
5: 159744.. 190463: 198656.. 229375: 30720:
6: 190464.. 223231: 231424.. …
Run Code Online (Sandbox Code Playgroud) 我有几个文件大小 > 1 GB。我需要从文件中删除最后几个字节。我该怎么做?我更喜欢就地编辑文件以节省磁盘空间。
我在 HP-UX 上。