此处提供三种方法实现“将两个文件中相同行号的行连接成一行”。
前两种方法也可以细节化的呈现Perl中foreach和while的区别。
第三种方法基于数组的处理,只用一层循环即可实现。
1、method1是用嵌套的两个foreach循环来实现该功能。
#!/usr/bin/perl
open LISTA, "listA" or die $!;
open LISTB, "listB" or die $!;
open CONNECT, ">list_meth1" or die $!;
@list_A = <LISTA>;
@list_B = <LISTB>;
$count1 = 0;
$count2 = 0;
foreach my $list_A(@list_A){
chomp $list_A;
$count1++;
my $lineA = $list_A;
foreach my $list_B(@list_B){
$count2++;
chomp $list_B;
my $lineB = $list_B;
my $lines = "$lineA" . " " . "$lineB";
if($count2 == $count1){
print CONNECT "$lines\n";
print "$lines $count1\n";
$count2 = 0;
close LISTA;
close LISTB;
close CONNECT;
注意:$count2是全局变量,没有采用my $count2这种局部变量。这是为了每次从外层循环进入内层循环时,count2都是从0开始,而不是继续上一次内层循环的连加。如果listA和listB都有100行,那么处理次数有100X100=10000次
2、method2是用foreach内嵌套while循环来实现该功能。
#!/usr/bin/perl
open LISTA, "listA" or die $!;
open LISTB, "listB" or die $!;
open CONNECT, ">list_meth2" or die $!;
@list_A = <LISTA>;
$count1 = 0;
$count2 = 0;
foreach my $list_A(@list_A){
chomp $list_A;
$count1++;
my $lineA = $list_A;
while ($list_B = <LISTB>){
$count2++;
chomp $list_B;
my $lineB = $list_B;
my $lines = "$lineA" . " " . "$lineB";
print CONNECT "$lines\n";
print "$lines $count1\n";
last;
close LISTA;
close LISTB;
close CONNECT;
注意:为了展示出method1和method2的区别,method1被删除的部分留下了空行。除了内层循环从foreach语句变成while语句之外,内层的while循环中加了last语句,用于立刻结束内层循环,可以跳到外层循环。如果listA和listB都有100行,那么处理次数有100X1=100次
Example:
listA 文本内容如下:
ADD_SVT08
DFF_LVT08
LATCH_ULT08
listB 文本内容如下:
SVT08_ADD
LVT08_DFF
ULT08_LATCH
两个文本的相同行号内容相连接之后产生的文件内容如下:
ADD_SVT08 SVT08_ADD
DFF_LVT08 LVT08_DFF
LATCH_ULT08 ULT08_LATCH
foreach 和 while 两者的不同之处在于它们背后的运作方式:
在while循环里,Perl会读入一行输入,把它存入某个变量并且执行循环主体。然后,它再回头去找其他的输入行。 while循环是一行一行处理。
在foreach循环中,整行输入操作符会在列表上下文中执行(因为foreach需要逐行处理列表的内容)。在foreach循环开始执行之前,它必须先将输入全部读进来。
当输入大容量的文件时,使用foreach会占用大量的内存。两者的差异会十分明显。因此,最好的做法,通常是尽量使用while循环的简写,让它每次处理一行。
3、method3是基于数组再采用foreach循环的方法来实现该功能。
该方法只用一层foreach循环。
#!/usr/bin/perl
open LISTA, "listA" or die $!;
open LISTB, "listB" or die $!;
open CONNECT, ">list_meth3" or die $!;
@list_A = <LISTA>;
@list_B = <LISTB>;
@list_all = (@list_A, @list_B);
$count = 0;
foreach my $list_all(@list_all){
chomp $list_all;
$count++;
$cellnum = ($#list_all+1)/2;
if($count <= $cellnum){
$lines[$count-1] = "$list_all[$count-1]" . " " . "$list_all[$count-1+$cellnum]";
print CONNECT $lines[$count-1]";
chomp $lines[$count-1];
print "$lines[$count-1] $count\n";
close LISTA;
close LISTB;
close CONNECT;
该方法是将两个数组连接到一起作为一个数组,再按照顺序规律来实现两行的连接。
此处提供两种方法实现“将两个文件中相同行号的行连接成一行”,这两种方法也可以细节化的呈现Perl中foreach和while的区别。#!/usr/bin/perlopen LISTA, "listA" or die $!;
脚本命名change.pl,采用传参的方式:
#!/usr/bin/perl
open(DATA,"<$ARGV[0]") or die "FAILED: Cant open file!!!";
open(NDATA,"+>out.txt");
while(<DATA>){
chomp;
print NDATA $_;
close(DATA);
close(NDA
有的时候,很多fasta文件是这个样子的:
但是,有些软件或者程序只能是一行id,一行序列的读取。这就要求我们需要将上述格式序列多行转一行。下面这段代码可以解决上述问题。
#!/usr/bin/perl
use strict;
use warnings;
my $id;
my $seq;
open IN,"$ARGV[0]" or die "Can't open fasta file!";
local $/ = ">";
<IN>;##第一个">"过掉
while (<I
4 Replies
有时候我们有这样的需求,就是将多行文件合并成一行,那么在linux下我们怎么实现呢?1、tr我们知道tr可以进行替换操作,对吧,那我们将换行符“\n”进行下替换就行了么,不过要注意最后一个换行的处理
注意最后一个echo可以找回我们的最后一个换行
2、awk
awk的实现原理,其实主要是OR...
with open('program.py', 'r') as f:
# 创建一个新的文本文件
with open('program_with_line_number.txt', 'w') as f2:
# 初始化行号为1
line_number = 1
# 逐行读取程序文件中的每一行
for line in f:
# 在每一行前添加行号
line_with_number = str(line_number) + ': ' + line
# 把添加了行号的每一行写入新的文本文件中
f2.write(line_with_number)
# 行号加1
line_number += 1
这个程序会把程序文件中的每一行添加行号后写入一个名为“program_with_line_number.txt”的文本文件中。