linux - 使用 Unix/Linux 命令遍历一定数量的行后,根据模式拆分一行
问题描述
我有一个 100469448 行数的文件。我想以这样的方式将文件分成两部分,即在解析了几乎一半的行数后,它会查找“ </ abc> 和一个空行”并从下一行拆分。
示例文件
<abc>
d
f
.
.
.
</abc>
x
d
w (line number 50469450)
</abc>
<abc>
w
d
s
etc
上面的文件应该被拆分成两个文件,文件1(遍历几乎一半的文件后拆分)
<abc>
d
f
.
.
.
</abc>
x
d
w (line number 50469450)
</abc>
和文件2
<abc>
w
d
s
etc
解决方案
假设您的输入文件如下所示:
$ cat infile
<abc>
a
b
c
</abc>
<abc>
d
e
f
g
h
i
j
k
l
m
</abc>
<abc>
n
o
</abc>
<abc>
p
q
r
</abc>
首先,我们拆分成两个文件:
split -l $(($(wc -l < infile) / 2 + 1)) infile
split -l n
分割成文件,n
每个文件都有行。我们想得到两个文件,所以我们取输入行数并将其分成两半:$(wc -l < infile) / 2
. 这是整数除法,所以对于奇数行(比如 11 行),我们最终会得到三个文件(5、5 和 1 行);为了避免这种情况,我们加 1。
我们现在有这两个文件:
xaa
:
<abc>
a
b
c
</abc>
<abc>
d
e
f
g
h
i
j
k
xab
:
l
m
</abc>
<abc>
n
o
</abc>
<abc>
p
q
r
</abc>
我们希望第一部分xab
成为第一个文件的一部分。为此,我们使用csplit
分割模式:
csplit xab '/<abc>/'
这分为xab
两个新文件:
xx00
:
l
m
</abc>
xx01
:
<abc>
n
o
</abc>
<abc>
p
q
r
</abc>
我们想要的两个文件是xaa
plusxx00
和xx01
. 我们连接并重命名:
cat xaa xx00 > file1
mv xx01 file2
并清理:
rm xaa xab xx00
评论
GNUsplit
有一个选项来规定要拆分的文件数量:
split -n2 infile
或者,为了防止分割线:
split -n l/2 infile
但输出文件可能有不同数量的行,因为拆分是按字节大小而不是行数。
推荐阅读
- ruby-on-rails - 如果每条记录为零,Rails 会更新多条记录
- python-3.x - Apache Zeppelin python到角度绑定不会一直发生,取消绑定会出错
- css - 我们可以先下载字体以避免显示浏览器默认字体吗
- javascript - 我应该绝对避免将 useState 与 redux 一起使用吗?
- azure - 如果我在 Azure VM 中从 SSD 切换到 HDD,我会丢失磁盘中的数据吗?
- terraform - 有压缩 JSON 的功能吗?
- google-sheets - 谷歌表格:分别比较一列的每个单元格,并检查找到的行中的另一个单元格的条件格式
- python - 如何打印用户想要的某个字符串的字母
- flutter - 从 flutter_bluetooth_serial 依赖项运行 getBondedDevices() 函数时应用程序崩溃
- android - Jetpack Compose - 如何在可滚动的非惰性列中控制 IME(键盘)?