我有幾個到幾百形式操縱多個線路使用Perl
1st 2n 2p 3n 3p 4n 4p
1ABJa 2 20 8 40 3 45
1ABJb 2 40 8 80 3 45
2C3Da 4 50 5 39 2 90
2D4Da 1 10 8 90 8 65
(製表符分隔的文件)
行文件從這個文件,我想操縱具有相似的所有行在第1列(即1ABJa和1ABJb)中有4個開始字符,並且執行:
- 對於第1列,合併兩個名稱以維護常用字符;
- 列
2n, 3n, 4n...
這些數字將相加; - 列
2p, 3p, 4p, ...
數字將被平均。
(請注意,這可以通過列位置而不是名稱來指定)。 然後這將產生:
1st 2n 2p 3n 3p 4n 4p
1ABJab 4 30 16 60 6 45
2C3Da 4 50 5 39 2 90
2D4Da 1 10 8 90 8 65
你會如何解決這個問題?
這可能是最複雜的方式來做到這一點,但它在這裏:我正在考慮創建第一列所有4字符獨特元素的數組。然後,對於該數組,運行一個可找到與這4個字符匹配的所有實例的循環。如果有超過1個實例,請標識它們,推動列並對其進行處理。下面是我到現在爲止點:
#!/usr/local/bin/perl
use strict;
use warnings;
use feature 'say';
use List::MoreUtils qw(uniq);
my $dir='My\\Path\\To\\Directory';
open my $in,"<", "$dir\\my file.txt" or die;
my @uniqarray; my @lines;
#collects unique elements in 1st column and changes them to 4-character words
while (my $line = <$in>) {
chomp $line;
@lines= split '\t', $line;
if (!grep /$lines[0]/, @uniqarray){
$lines[0] =~ s/^(.{4}).*/$1/;
push @uniqarray,$lines[0];
}
}
my @l;
#for @uniqarray, find all rows in the input that match them. if more than 1 row is found, manipulate the columns
while (my $something=<$in>) {
chomp $something;
@l= split '\t', $something;
if (map $something =~ m/$_/,@uniqarray){
**[DO STUFF]**
}
}
print join "\n", uniq(@uniqarray);
close $in;
在你的榜樣輸出,爲什麼是第一行'1ABJab'?你還沒有指定一條規則,所以它看起來就像'1ABJa'一樣簡單。 – ThisSuitIsBlackNot
我給它命名爲'1ABJab',因爲它包含'1ABJa'和'1ABJb'的數據,我想將它與其他行區分開來。我將爲此添加規則。謝謝! – Sosi
唯一困難的部分是提出最終結果,因爲'yeild's'看起來像事後,結果與未分析的行合併。 – sln