awk将单个文件划分为具有特定文件名的多个文件

时间:2017-10-26 14:49:03

标签: file awk sed

我有一个原始文件,其中包含以下特定格式的数据:

$ 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,没有任何扩展名。我想按照第一行中提到的名称保存这些单独的文件,这些名称为RUNX1TFAP2ATFAP2C,扩展名为.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 ]

依旧......

感谢您抽出宝贵时间帮助我!

5 个答案:

答案 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 *检查结果。