使用awk或sed提取每列的第一个字符并将其存储在单独的文件中

时间:2013-10-14 01:02:24

标签: input awk

我有一个如下文件

AT AT AG AG
GC GC GG GC

我想提取每个col的第一个和最后一个字符,将它们存储在两个不同的文件中

File1中:

A A A A
G G G G

文件2:

T T G G
C C G C

我的输入文件非常大。这是我可以用awk或sed做的一种方式

4 个答案:

答案 0 :(得分:2)

使用GNU awk for gensub():

gawk '{
    print gensub(/.( |$)/,"","g") > "file1"
    print gensub(/(^| )./,"","g") > "file2"
}' file

你可以在任何带有gsub()和几个变量的awk中做类似的事情。

答案 1 :(得分:1)

你可以试试这个:

写在test.awk

#!/usr/bin/awk -f

 BEGIN {

 #   FS = "[\s]+"
     outfile_head="file1"
     outfile_tail="file2"
 }

     {
         num = NF
         for(i = 1; i <= NF; i++) {
             printf "%s ", substr($i, 0, 1) >> outfile_head
             printf "%s ", substr($i, length($i), 1) >> outfile_tail
         }
     }

然后你运行这个: ./test.awk文件

答案 2 :(得分:0)

两次通过很容易做到:

sed 's/\([^ ]\)[^ ]/\1/g' file > file1
sed 's/[^ ]\([^ ]\)/\1/g' file > file2

一次性完成这是一项挑战......

答案 3 :(得分:0)

编辑1:修改了多行编辑。

如果您打算编辑并共享它,您可以编写一个perl脚本并传入文件名。这只循环文件一次,不需要将文件存储在内存中。

文件“seq.pl”:

#!/usr/bin/perl

open(F1,">>$ARGV[1]");
open(F2,">>$ARGV[2]");
open(DATA,"$ARGV[0]");
while($line=<DATA>) {
  $line =~ s/(\r|\n)+//g;
  @pairs = split(/\s/, $line);
  for $pair(@pairs) {
    @bases = split(//,$pair);
    print F1 $bases[0]." ";
    print F2 $bases[length($bases)-1]." ";
  }
  print F1 "\n";
  print F2 "\n";
}
close(F1);
close(F2);
close(DATA);

执行它:

perl seq.pl full.seq f1.seq f2.seq

档案“full.seq”:

AT AT AG AG
GC GC GG GC
AT AT GC GC

档案“f1.seq”:

A A A A
G G G G
A A G G

档案“f2.seq”:

T T G G
C C G C
T T C C