セミコロンで区切られたデータを含む3つの列を持つタブ区切りファイルがあります。 (3つの列の3つの条件をすべて満たす)各列の値をフィルタリングしたい:1列目(<-0.5)、2列目(> 1)、3列目(> 2)。実際のデータには複数の列があります。
入力する
-0.6;0.14;-0.56;0.2 10.4;NA;5.1;2 3;1;4;3 A;B;C;D
-0.9;-0.16;-1.1 2.4;0.1;0.9 10;1;3 E;F;G
希望の出力
-0.6;-0.56 10.4;5.1 3;4 A;C
-0.9 2.4 10 E
各行の各列の値の数は、フィルタリングの前後に同じでなければなりません。
ベストアンサー1
ここでPerlに関するクレイジーなものがあります。
perl -lane '
BEGIN {
@criteria = (
sub {shift() < -0.5},
sub {shift() > 1},
sub {shift() > 2},
)
}
@filtered = ();
for $i (0..$#F) {
push @filtered, join ";", grep {$criteria[$i]->($_)} split /;/, $F[$i];
}
print join " ", @filtered;
' file | column -t
-0.6;-0.56 10.4;5.1 3;4
-0.9 2.4 10
これはあなたの要求をより正確に反映します。
perl -lane '
sub criteria {
$_[0] < -0.5 and
$_[1] > 1 and
$_[2] > 2
}
@data = map {[split /;/]} @F;
@filtered = map {[]} @F;
for ($i = 0; $i < @{$data[0]}; $i++) {
@tuple = map {$data[$_][$i]} (0..$#F);
if (criteria(@tuple)) {
push @{$filtered[$_]}, $tuple[$_] for (0..$#F);
}
}
print join " ", map {join ";", @$_} @filtered;
' file