合并和拆分,在 bash 中使用 csplit
Merge and split, using csplit in bash
我正在合并三个三个文件 (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
直到其中一个文件结束时,这两对文件完全相同。
有人知道为什么会这样吗?将不胜感激。
文件中的最后几行没有以换行符结尾。因此,当您将分隔符添加到合并文件中时,您就是将其添加到文件最后一行的末尾。最后一行然后与 csplit
匹配,整行都被删除了。因此,最后几个字符被删除。
csplit
的 --supress-matched
选项将抑制匹配模式的 整个 行匹配。
我正在合并三个三个文件 (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
直到其中一个文件结束时,这两对文件完全相同。
有人知道为什么会这样吗?将不胜感激。
文件中的最后几行没有以换行符结尾。因此,当您将分隔符添加到合并文件中时,您就是将其添加到文件最后一行的末尾。最后一行然后与 csplit
匹配,整行都被删除了。因此,最后几个字符被删除。
csplit
的 --supress-matched
选项将抑制匹配模式的 整个 行匹配。