我有一个如下文件
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做的一种方式
答案 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