我有一个大文件,需要拆分成两个文件。假设在第一个文件中应该选择 1000 行并将其放入另一个文件中并删除第一个文件中的那些行。
我尝试使用,split
但它正在创建多个块。
是否可以使用 csplit 删除分隔符?例子:
$ cat in
abc
---
def
---
ghi
$ csplit -q in /-/ '{*}'
$ ls x*
xx00 xx01 xx02
$ head xx*
==> xx00 <==
abc
==> xx01 <==
---
def
==> xx02 <==
---
ghi
Run Code Online (Sandbox Code Playgroud)
而不是它所做的,即拆分并保留分隔符,是否可以要求它拆分并删除分隔符?
也就是说,所需的输出是这样的:
$ sed -i '/-/d' xx*
$ head xx*
==> xx00 <==
abc
==> xx01 <==
def
==> xx02 <==
ghi
Run Code Online (Sandbox Code Playgroud)
虽然可以像上面那样分两步完成,但是可以一步完成吗?
如果不能用 csplit 完成,有没有比上面的两个调用(csplit + sed)更短的一步法?不偏爱使用的工具,只要它具有合理的可读性。
我正在处理这个包含其他几个文件的大文件(DATA.DAT,~900MB)。它来自PS2游戏。
声音样本(.AIFF格式),正是我所追求的,构成了它的大部分大小。
在网上搜索 PS2 .DAT提取器后,我发现它们基本上依赖于开发人员,并且由于该游戏/工具相当晦涩,而且在网上找不到太多相关信息,因此我想自己实现该过程的自动化。
在十六进制编辑器上检查文件时,我发现了一些.AIFF标头,将这些块克隆到新的.AIFF文件中,无需任何进一步的工作,它们就可以播放了。
花了一段时间从我非常有限的 bash 知识中摆脱了生锈并在这里阅读了类似的问题,我想出了这个表达:
gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'
Run Code Online (Sandbox Code Playgroud)
(我在 OSX 上使用 coreutils,因此 csplit 上有 g- 前缀)
鉴于.AIFF文件以字符串“FORM”开头,并且文件中的所有样本基本上都彼此相邻(由不会在样本上产生不需要的末端噪声的可忽略数量的数据隔开),我认为正则表达式
/FORM/
Run Code Online (Sandbox Code Playgroud)
将足以拆分文件。
但是,每个拆分文件都带有垃圾数据,这些数据位于.AIFF标头之前的声音样本之间,使其无法播放。
下面是分割声音样本的十六进制数据的屏幕截图:
这个实际示例大约开始于 1500 字节标记:
是什么让这个表达式用偏移量分割文件?
我在 Linux 上有一个文件,其中包含数千个分子的坐标。每个分子都以包含始终相同模式的一行开始:
@<TRIPOS>MOLECULE
Run Code Online (Sandbox Code Playgroud)
然后继续其他行。我想将文件拆分为多个文件,每个文件包含一定数量的分子。什么是最简单的方法来做到这一点?
我想将 .txt 文件的内容拆分为多个文件,但我遇到了关于 csplit 限制的两个问题:
(1) 任何人都可以提供绕过 csplit '99' 文件拆分的最大限制的方法吗?我有一个基于重复出现的空行或字符最多可拆分 384 个的文件。我希望 csplit 能够使用 {*} 来适应这一点,但这超出了 csplit 的固有文件生成能力。
(2) 有没有人知道将文件内容传递给 csplit(管道到 csplit)的方法,或者 csplit 只能以其传统的方式调用文件吗?即csplit -f split_name file_to_split.txt /split/ {*}
与[series of commands] | csplit -f split_name /split/ {*}
感谢您提供任何建议或完成类似任务的替代方法。
如何在 Mac 上获取现代 coreutils?
我使用以下方法遇到了这个问题csplit
:
foo.txt
:
foo
1
foo
2
foo
3
Run Code Online (Sandbox Code Playgroud)
$: csplit foo '^foo$' '{*}'
# error
Run Code Online (Sandbox Code Playgroud)
仔细检查Mac 上的manpage
, man csplit
,csplit
是 FreeBSD 版本,并且不提供该'{*}'
选项。事实上,我必须提前提供准确的分割次数。这要么会触发czplit
我重新实现,要么我可以GNU coreutils
在 mac 上登录。
有办法吗?