对于一个项目,我必须处理大型数据集并遇到一个问题(我没有预料到)。
我有一个包含约 10000 个文件(10000 个“患者”)的文件夹,每个文件包含约 200 万个条目(测量值)。
为了进一步分析,我需要对这些患者之间的每项测量结果进行比较。
因此,我想制作 200 万个文件,每个文件有 10000 个条目。然而,使用 Bash,这对于我的方法来说似乎是不可行的,基本上是:
awk 'FNR==$1' $INPUTPATH > $OUTPUTPATH
我在其中输入行号$1
并在大约 1000 个核心上并行化它。
有什么办法可以提高效率吗?
答案1
awk 'FNR==$1' $INPUTPATH > $OUTPUTPATH
这里的问题是awk匹配后继续读取文件。如果你使用sed相反,您可以轻松停止读取文件。
例如。如果您(仅)想要使用名为 F1 的文件中的第 1000 行sed
/usr/bin/sed -n -e '1000p' -e '1000q' F1
这是一个 shell 脚本,我认为它可以解决您的问题:
for AFILE in "$INPUTPATH"
do
POS=1
while read -r ALINE
do
echo "$ALINE" >> "$OUTPUTPATH"/$POS
POS=$((POS+1))
done
done