我有一个包含大量 vcard 的 vcf 文件。
将 vcf 文件导入到 Outlook 时,它似乎只导入了第一个 vcard。
因此我想把它们分开。
鉴于 vcard 以
BEGIN:VCARD
Run Code Online (Sandbox Code Playgroud)
并以
END:VCARD
Run Code Online (Sandbox Code Playgroud)
将每个 vcard 拆分为自己的文件的最佳方法是什么。
谢谢
更新
感谢所有的回应。对于这种性质的问题,有多种方法可以给猫剥皮。这是我选择我所做的那个的原因。
围捕
这是我从每个答案中喜欢的内容以及促使我选择其中一个答案的汇总。
csplit: 我真的很喜欢这种方法的简洁性。我只是希望它也能够设置文件扩展名。gawk: 它做到了我要求的一切。paralell: 工作了。但我不得不安装新东西。(它还决定在我的主目录中创建一个新的 /bin 目录)perl:我喜欢它根据联系人的姓名创建 vcf。但是 -o 选项并没有真正起作用结论
perl因为有点破paralell因为我必须安装新东西csplit,因为据我所知,它无法在输出文件上创建扩展名cmp太:)所以我试图将 64MB 文件分割FileCarve.001成 512 字节段(每个块长 512 字节)。我需要确保文件在分割成较小的文件时具有相同的数据,因此我将cat所有文件进行标准输出并将其通过管道传输到sha256sum(有很多文件,所以我需要使用find和 来执行此操作xargs)。
当命令分割输出时,将文件分割为 512 字节段似乎会导致数据混乱split。
$ dd if=FileCarve.001 bs=512 | split -b512 - splits/img
131072+0 records in
131072+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 4.10824 s, 16.3 MB/s
$ sha256sum FileCarve.001
3e64100044099b10060f5ca3194d4d60414941c7cb26437330aba532852a60cd FileCarve.001
$ find splits/ -type f -print0 | xargs -0 cat | sha256sum
25b37f28204895e5d0b1cb160c5fa599d15188baf7e529ccc92a10fdb3f0515a -
Run Code Online (Sandbox Code Playgroud)
但将文件分割为 1 KB 段(1000 字节)似乎效果很好。
$ dd if=FileCarve.001 bs=512 | split -b1k …Run Code Online (Sandbox Code Playgroud) 如何以一种模式将大文件分成两部分?
举个例子file.txt:
ABC
EFG
XYZ
HIJ
KNL
Run Code Online (Sandbox Code Playgroud)
我想这个文件在拆分XYZ,使得file1包含排队到XYZ休息的线条file2。
是否有按换行符拆分文件的实用程序?例如,如果文件包含以下几行,
aa
bbb
cccc
Run Code Online (Sandbox Code Playgroud)
如果我想将其拆分为 3 个文件,所需的输出将是:
aa,bbb和cccc(在 3 个不同的文件中)
我已经检查了split命令,它只按文件大小剪切文件,而不是我想要的。
如果我自己不编写实用程序,是否有任何标准工具可以使用?
我有一个目录树,我想将其备份到光盘。不幸的是,它超过了任何一个磁盘的大小(大约 60GB)。我正在寻找一个脚本,可以将这棵树分割成适当大小的块,并带有硬链接或诸如此类的东西(保持原始文件不变)。然后我可以将这些一口大小的树提供给备份过程(添加 PAR2 冗余等)。
这不是一个花哨的脚本,但它似乎已经完成了。建议?
(一步跨越和写作是不行的,因为我想在文件被烧毁之前做更多的事情。)
我有一个任务来处理 stdin 上的文件列表。程序的启动时间很长,每个文件所用的时间差异很大。我想生成大量这样的进程,然后将工作分派给不忙的进程。有几种不同的命令行工具几乎可以满足我的要求,我将其缩小到两个几乎可以工作的选项:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Run Code Online (Sandbox Code Playgroud)
问题是split做一个纯循环,所以其中一个进程落后又落后,延迟了整个操作的完成;虽然parallel想要每 N 行或每字节输入产生一个进程,但我最终在启动开销上花费了太多时间。
是否有类似的东西可以将流程和馈送线重用于已解锁标准输入的任何流程?
相关,但没有令人满意的答案:如何将大型文本文件拆分为 500 字左右的块?
我正在尝试将一个文本文件(http://mattmahoney.net/dc/text8.zip)在一行中包含 > 10^7 个单词,然后将其拆分为每行包含 N 个单词的行。我目前的方法有效,但相当缓慢和丑陋(使用 shell 脚本):
i=0
for word in $(sed -e 's/\s\+/\n/g' input.txt)
do
echo -n "${word} " > output.txt
let "i=i+1"
if [ "$i" -eq "1000" ]
then
echo > output.txt
let "i=0"
fi
done
Run Code Online (Sandbox Code Playgroud)
关于如何使这个更快或更紧凑的任何提示?
我想只使用 bash拆分'hello'成h e l l o一个数组,我可以在 sed 中做到这一点,sed 's/./& /g'但我想知道当我不知道分隔符是什么时,如何在 Bash 中将一个字符串拆分成一个数组,或者分隔符是任何单个字符。我不认为我可以在${i// /}没有一些创造力的情况下使用,因为分隔符是未知的,而且我认为该表达式不接受正则表达式。我尝试将 BASH_REMATCH 与 [[ string =~ ([az].).* ]] 一起使用,但它没有按我预期的那样工作。仅使用 bash 来完成某种string.split()行为的正确方法是什么?原因是我试图在所有 bash 中编写 rev 实用程序:
while read data; do
word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
new=()
i=$((${#word[@]} - 1))
while [[ $i -ge 0 ]]; do
new+=(${word[$i]})
(( i-- ))
done
echo ${new[@]}|tr -d ' '|tr '_' ' '
done
Run Code Online (Sandbox Code Playgroud)
但是我使用了 tr 和 sed,我想知道如何正确进行拆分,然后我会将其修复为所有 bash。只是为了好玩。
我有一个大(~60G)的压缩文件(tar.gz)。
我曾经split把它分成 4 部分,然后cat将它们重新连接在一起。
但是,现在,当我尝试估计未压缩文件的大小时,结果发现它比原始文件小?这怎么可能?
$ gzip -l myfile.tar.gz
compressed uncompressed ratio uncompressed_name
60680003101 3985780736 -1422.4% myfile.tar
Run Code Online (Sandbox Code Playgroud)