【问题标题】:Merge and split, using csplit in bash合并和拆分,在 bash 中使用 csplit
【发布时间】:2019-01-20 10:50:04
【问题描述】:

我正在合并三个三个文件(ls -l):

-rw-rw-r-- 1 kacper kacper 1839510 sie 13 14:27 A.jpg
-rw-rw-r-- 1 kacper kacper 2014809 sie 13 14:27 B.jpg
-rw-rw-r-- 1 kacper kacper 1277047 sie 13 14:27 C.pdf

使用 bash 合并到一个文件中:

cat A.jpg >> merged 
echo $SEPARATOR >> merged 
cat B.jpg >> merged 
echo $SEPARATOR >> merged 
cat C.pdf >> merged

地点:

SEPARATOR=PO56WLH82SN1ZS5QH5EU9FOZVLBRLHAGHO3D5KOUSPMS6KYSFAYN2DBL

接下来我将合并的文件分成三个部分:

csplit --suppress-matched merged --prefix="PART_" '/'$SEPARATOR'/' {*}

这会产生 PART_00、PART_01、PART_02 (ls -l):

-rw-rw-r--  1 kacper kacper 1839398 sie 13 18:41 PART_00
-rw-rw-r--  1 kacper kacper 2014507 sie 13 18:41 PART_01
-rw-rw-r--  1 kacper kacper 1277047 sie 13 18:41 PART_02

PART_00 和 PART_01 为 JPG 文件,可以正常显示。 PART_02 是一个 PDF 文件,可以打开和查看。所以,乍一看,这在我看来是成功的。

问题在于 PART_00(1839398 字节)的大小比 A.jpg(1839510 字节)略小。其他文件(PART_01、B.jpg 和 PART_02、C.pdf)也是如此。使用

逐字节检查文件后
cmp

到其中一个文件结束时,这对文件完全相同。

有人知道为什么会这样吗?建议将不胜感激。

【问题讨论】:

  • 最有可能和 X-Y 问题。你为什么做这个?你知道tar和朋友吗?
  • 嗨 karakfa。这最终将用于将进程的输出流拆分为单独的数据块,tar 可能不是这项工作的工具。

标签: bash merge size csplit


【解决方案1】:

文件中的最后一行不以换行符终止。因此,当您将分隔符添加到合并文件中时,您会将其添加到文件最后一行的末尾。最后一行与csplit 匹配,整行被删除。因此,最后几个字符被删除了。

csplit--supress-matched 选项将抑制匹配模式的整个行。

【讨论】:

  • 多谢了。几乎通过将回显行更改为: echo -e "\n"$SEPARATOR >> 合并现在 PART_00 和 PART_01 比 A.jpg 和 B.jpg 大 1 个字节。 PART_02 的大小与 C.pdf 完全相同。额外的字节是 0a(十六进制)。关于如何丢弃它的任何想法?
  • 解决方法 1) 将 echo 行更改为:echo -e "\n"$SEPARATOR >> 合并 2) 使用 truncate 删除最后一个字节
猜你喜欢
  • 2015-08-02
  • 1970-01-01
  • 2021-10-19
  • 2015-08-08
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多