我有一个原始文件,其中包含以下特定格式的数据:
$ cat sample.txt
>MA0002.1 RUNX1
A [ 10 12 4 1 2 2 0 0 0 8 13 ]
C [ 2 2 7 1 0 8 0 0 1 2 2 ]
G [ 3 1 1 0 23 0 26 26 0 0 4 ]
T [ 11 11 14 24 1 16 0 0 25 16 7 ]
>MA0003.1 TFAP2A
A [ 0 0 0 22 19 55 53 19 9 ]
C [ 0 185 185 71 57 44 30 16 78 ]
G [ 185 0 0 46 61 67 91 137 79 ]
T [ 0 0 0 46 48 19 11 13 19 ]
>MA0003.3 TFAP2C
A [ 1706 137 0 0 33 575 3640 1012 0 31 1865 ]
C [ 1939 968 5309 5309 1646 2682 995 224 31 4726 798 ]
G [ 277 4340 139 11 658 1613 618 5309 5309 582 1295 ]
T [ 1386 47 0 281 2972 438 56 0 0 21 1350 ]
我想将此文件分成基于字母>
的单个文件,我知道这个字符出现在每隔5行之后。我可以通过以下方式做到这一点:
awk 'NR%5==1{x="F"++i;}{print > x}' sample.txt
问题是它是否正确创建了多个文件,但文件名分别为F1,F2和F3,没有任何扩展名。我想按照第一行中提到的名称保存这些单独的文件,这些名称为RUNX1
,TFAP2A
和TFAP2C
,扩展名为.pfm
。
这样最终文件将如下所示:
$ cat RUNX1.pfm
>MA0002.1 RUNX1
A [ 10 12 4 1 2 2 0 0 0 8 13 ]
C [ 2 2 7 1 0 8 0 0 1 2 2 ]
G [ 3 1 1 0 23 0 26 26 0 0 4 ]
T [ 11 11 14 24 1 16 0 0 25 16 7 ]
$ cat TFAP2A.pfm
>MA0003.1 TFAP2A
A [ 0 0 0 22 19 55 53 19 9 ]
C [ 0 185 185 71 57 44 30 16 78 ]
G [ 185 0 0 46 61 67 91 137 79 ]
T [ 0 0 0 46 48 19 11 13 19 ]
依旧......
感谢您抽出宝贵时间帮助我!
答案 0 :(得分:2)
就是这样
awk -v RS=">" '{print RS$0 > $2".pfm"; close($2".pfm")}' file
如果已保存具有相同名称的文件,则要保存新文件,请使用以下文件:
awk -v RS=">" '{a[$2]++; if(a[$2]>1) file=$2"."a[$2]; else file=$2; print RS$0 > file".pfm" ; close(file".pfm")}' file
例如。如果之前保存了 TFAP2A.pfm ,则新文件将保存为 TFAP2A.2.pfm TFAP2A.3.pfm ....等等
或者只是
awk -v RS=">" '{file=$2"."++a[$2]; print RS$0 > file".pfm" ; close(file".pfm")}' file
如果要使用版本Ex保存每个文件。 abc.1.pfm abc.2.pfm
答案 1 :(得分:1)
关注awk可能对你有帮助。
awk '/^>/{if(file){close(file)};file=$2".pfm"} {print > file".pfm"}' Input_file
此处还添加了非单一的衬垫形式,并附有说明。
awk '
/^>/{ ##Checking here if any line starts with ">" if yes then do following actions.
if(file){ ##Checking if value of variable named file is NOT NULL, if condition is TRUE then do following.
close(file) ##close is awk out of the box command which will close any opened file, so that we could avoid situation of too many files opened at a time.
};
file=$2".pfm" ##Setting variable named file to 2nd filed of the line which starts from ">" here.
}
{
print > file".pfm"##Printing the value of current line to file".pfm" which will create file with $2 and .pfm name and put output into output files.
}
' Input_file ##Mentioning the Input_file name here.
<强> 编辑: 强>
awk '/^>/{if(file){close(file)};array[$2]++;file=array[$2]?(array[$2]==1?$2:$2"."array[$2]):$2} {print > file".pfm"}' Input_file
答案 2 :(得分:1)
awk 方法:
awk 'NR%5==1{ fn=$2".pfm" }fn{ print > fn}' file
或使用>
标记相同:
awk '/^>/{ fn=$2".pfm" }fn{ print > fn}' file
答案 3 :(得分:1)
如果名称被多次使用,则需要注意的是
一衬垫:
awk '/>/{f=$2 (a[$2]++?"."a[$2]-1:"") ".pfm"; if(f!=p){ close(p); p=f}}{print >f}' file
更好的可读性:
awk '/>/{
f=$2 (a[$2]++?"."a[$2]-1:"") ".pfm";
if(f!=p){
close(p);
p=f
}
}
{
print >f
}
' file
输入:
$ cat file
>MA0002.1 RUNX1
A [ 10 12 4 1 2 2 0 0 0 8 13 ]
C [ 2 2 7 1 0 8 0 0 1 2 2 ]
G [ 3 1 1 0 23 0 26 26 0 0 4 ]
T [ 11 11 14 24 1 16 0 0 25 16 7 ]
>MA0003.3 TFAP2C
A [ 1706 137 0 0 33 575 3640 1012 0 31 1865 ]
C [ 1939 968 5309 5309 1646 2682 995 224 31 4726 798 ]
G [ 277 4340 139 11 658 1613 618 5309 5309 582 1295 ]
T [ 1386 47 0 281 2972 438 56 0 0 21 1350 ]
>MA0003.1 TFAP2A
A [ 0 0 0 22 19 55 53 19 9 ]
C [ 0 185 185 71 57 44 30 16 78 ]
G [ 185 0 0 46 61 67 91 137 79 ]
T [ 0 0 0 46 48 19 11 13 19 ]
>MA0003.3 TFAP2C
A [ 1706 137 0 0 33 575 3640 1012 0 31 1865 ]
C [ 1939 968 5309 5309 1646 2682 995 224 31 4726 798 ]
G [ 277 4340 139 11 658 1613 618 5309 5309 582 1295 ]
T [ 1386 47 0 281 2972 438 56 0 0 21 1350 ]
执行:
$ awk '/>/{f=$2 (a[$2]++?"."a[$2]-1:"") ".pfm"; if(f!=p){ close(p); p=f}}{print >f}' file
输出文件:
$ ls *.pfm -1
RUNX1.pfm
TFAP2A.pfm
TFAP2C.1.pfm
TFAP2C.pfm
每个文件的内容:
$ for i in *.pfm; do echo "Output File:$i"; cat "$i"; done
Output File:RUNX1.pfm
>MA0002.1 RUNX1
A [ 10 12 4 1 2 2 0 0 0 8 13 ]
C [ 2 2 7 1 0 8 0 0 1 2 2 ]
G [ 3 1 1 0 23 0 26 26 0 0 4 ]
T [ 11 11 14 24 1 16 0 0 25 16 7 ]
Output File:TFAP2A.pfm
>MA0003.1 TFAP2A
A [ 0 0 0 22 19 55 53 19 9 ]
C [ 0 185 185 71 57 44 30 16 78 ]
G [ 185 0 0 46 61 67 91 137 79 ]
T [ 0 0 0 46 48 19 11 13 19 ]
Output File:TFAP2C.1.pfm
>MA0003.3 TFAP2C
A [ 1706 137 0 0 33 575 3640 1012 0 31 1865 ]
C [ 1939 968 5309 5309 1646 2682 995 224 31 4726 798 ]
G [ 277 4340 139 11 658 1613 618 5309 5309 582 1295 ]
T [ 1386 47 0 281 2972 438 56 0 0 21 1350 ]
Output File:TFAP2C.pfm
>MA0003.3 TFAP2C
A [ 1706 137 0 0 33 575 3640 1012 0 31 1865 ]
C [ 1939 968 5309 5309 1646 2682 995 224 31 4726 798 ]
G [ 277 4340 139 11 658 1613 618 5309 5309 582 1295 ]
T [ 1386 47 0 281 2972 438 56 0 0 21 1350 ]
答案 4 :(得分:1)
这可能适合你(GNU sed&amp; csplit):
csplit -z file '/^>/' '{*}'
sed -ns '1F;1s/^\S\+\s*//p' xx* | sed 'N;s/\n/ /;s/^/mv -v /e'
使用csplit执行使用模式^>
分割文件的工作,即行开头的>
表示新文件。然后使用sed的两个调用来重命名文件。第一个输出原始文件名及其预期名称。第二个添加并执行move命令。将文件放在一个单独的目录中,然后使用head *
检查结果。