使用 linux 中的拆分函数将多个输入文件拆分为多个输出
Splitting multiple input files into multiple outputs using split function in linux
我有 8 个文件,我想将每个文件分成 5 个块。我通常会单独执行此操作,但希望 运行 这是一个循环。我在 HPC 工作。
我创建了一个文件名列表并将其标记为“variantlist.txt”。我的代码是:
for f in 'cat variantlist.txt'; do split ${f} -n 5 -d; done
但是,它只拆分 variantlist.txt 文件中的最终文件,仅从最终条目输出 5 个块。
即使我单独列出文件:
for f in chr001.vcf chr002 ...chr008.vcf ; do split ${f} -n 5 -d; done
它仍然只将最终文件分成 5 个块。
不确定我哪里出错了。所需的输出将是 40 个块,每个染色体 5 个。非常感谢您的帮助。
非常感谢
当使用 split
时,-n
swicth 将决定原始文件被分割成的输出文件的数量...
你需要 -l
作为你需要的行数,在你的例子中是 5:
split -l 5 ${f}
拆分是每次创建同一组文件并覆盖以前的文件。这是处理该问题的一种方法 -
for f in $(<variantlist.txt) # don't use cat
do mkdir -p $f.split # make a subdir for the files
( cd $f.split && # change into the subdir only in a subshell
split ../$f -n 5 -d # split from there
) # close the subshell, parent still in base dir
done
或者你可以这样做 -
while read f # grab each filename
do split $f -n 5 -d # split it
for x in x?? # for each split file
do mv $x $f.$x # rename it to include the parent file name
done
done < variantlist.txt # take names from this file
这要慢很多,但不使用子目录。
虽然我最喜欢 -
xargs -I {} split {} -n 5 -d {} < variantlist.txt
最后一个参数成为 split
的前缀,而不是 x
的默认值。
EDIT -- 每个文件有 20 亿行,使用这个:
for f in $(<variantlist.txt)
do split "$f" -d -n 5 "$f" & # run all in background at the same time
done
我有 8 个文件,我想将每个文件分成 5 个块。我通常会单独执行此操作,但希望 运行 这是一个循环。我在 HPC 工作。
我创建了一个文件名列表并将其标记为“variantlist.txt”。我的代码是:
for f in 'cat variantlist.txt'; do split ${f} -n 5 -d; done
但是,它只拆分 variantlist.txt 文件中的最终文件,仅从最终条目输出 5 个块。
即使我单独列出文件:
for f in chr001.vcf chr002 ...chr008.vcf ; do split ${f} -n 5 -d; done
它仍然只将最终文件分成 5 个块。
不确定我哪里出错了。所需的输出将是 40 个块,每个染色体 5 个。非常感谢您的帮助。
非常感谢
当使用 split
时,-n
swicth 将决定原始文件被分割成的输出文件的数量...
你需要 -l
作为你需要的行数,在你的例子中是 5:
split -l 5 ${f}
拆分是每次创建同一组文件并覆盖以前的文件。这是处理该问题的一种方法 -
for f in $(<variantlist.txt) # don't use cat
do mkdir -p $f.split # make a subdir for the files
( cd $f.split && # change into the subdir only in a subshell
split ../$f -n 5 -d # split from there
) # close the subshell, parent still in base dir
done
或者你可以这样做 -
while read f # grab each filename
do split $f -n 5 -d # split it
for x in x?? # for each split file
do mv $x $f.$x # rename it to include the parent file name
done
done < variantlist.txt # take names from this file
这要慢很多,但不使用子目录。
虽然我最喜欢 -
xargs -I {} split {} -n 5 -d {} < variantlist.txt
最后一个参数成为 split
的前缀,而不是 x
的默认值。
EDIT -- 每个文件有 20 亿行,使用这个:
for f in $(<variantlist.txt)
do split "$f" -d -n 5 "$f" & # run all in background at the same time
done