我有一个包含 22000 个基因的相关矩阵,为了进行一些分析,我需要将矩阵的每一行拆分为一个新文件。这意味着我需要创建 22000 个单独的文件。
我不想使用 split 命令(因为我想获取输出文件作为gene_name.txt)例如输入文件
IGHD2-15 IGHD3-22 IGHD3-16 IGHD3-10
IGHD2-15 1 0.696084 0.799736 0.818788
IGHD3-22 0.696084 1 0.691419 0.67505
IGHD3-16 0.799736 0.691419 1 0.810656
IGHD3-10 0.818788 0.67505 0.810656 1
答案1
假设您的基因名称位于第一列,您需要的是:
awk '{print >> $1".txt"; close(n".txt")}' matrix.txt
这会将每一行打印到一个文件中,该文件的名称是该行的第一个字段加上(完全可选).txt
扩展名。如果您不希望文件中包含基因名称,请使用:
awk '{n=$1; $1="";print >> n".txt"; close(n".txt")}' matrix.txt
并且,如果您的第一行是标题,请使用:
awk 'NR>1{print >> $1".txt"; close($1".txt")}' matrix.txt
最后,在不太可能的情况下,您的文件可能包含第一个字段不是简单基因名称但可以包含 NULL 或有效路径的行,因此您需要清理输入,您可以使用:
awk 'NR > 1 && ($1 ~ /^[A-Z0-9-]+$/) { print >> $1; close($1) }'
答案2
因为您没有给出您希望每个文件包含什么内容的示例,或者我猜测文件应该命名为什么。
这个将从当前目录中获取文件“DATA”,创建一个以每行第一列命名的新文件(在同一目录中),然后用其余列中的数据填充该文件。
意义
IGHD2-15 1 0.696084 0.799736 0.818788
创建一个名为 的文件IGHD2-15
并将其放入其中
1 0.696084 0.799736 0.818788
脚本:
#!/bin/bash
while read -r line; do
newFileName="$(echo "$line" | awk '{print $1}')"
newFileData="$(echo "$line" | awk '{$1 = ""; print $0}')"
echo $newFileData > $newFileName
done < DATA
答案3
我尝试了下面的方法,经检查它也工作正常
这里每一行都被复制到新文件中。文件名将是每行的第一列
cat data_file.txt
IGHD2-15 1 0.696084 0.799736 0.818788
IGHD3-22 0.696084 1 0.691419 0.67505
IGHD3-16 0.799736 0.691419 1 0.810656
IGHD3-10 0.818788 0.67505 0.810656 1
root@praveen_linux_example dev]# j=`cat data_file.txt| wc -l`
[root@praveen_linux_example dev]# for ((z=1;z<=$j;z++)); do filename=`awk -v line="$z" 'NR==line{print $1}' data_file.txt`; sed -n ''$z'p' data_file.txt >$filename.txt;done
[root@praveen_linux_example dev]#