我想读取文件(1600 行)并获取行,仅列具有不同的值(sno1、sno2、sno3 和 sno4 - 应该不等于值),并且它应该高于 50%。下面给出的输出示例
input.txt(制表符分隔)
id sno1 sno2 sno3 sno4
R1 98.4 88.8 98.4 67.6
R2 100 100 100 100
R3 33.4 23.5 98.8 45.5
R4 53.5 78.7 88.8 67.5
R5 0 0 0 0
R6 88.8 98.8 67.6 100
输出.txt
R4 53.5 78.7 88.8 67.5
R6 88.8 98.8 67.6 100
在 R4 和 R6 行中,所有列值都不彼此相等,并且都高于 50%。任何 awk/sed/perl 方面的帮助都值得赞赏。
答案1
Perl-oneliner:
perl -nae 'undef %saw ; next if $. == 1; shift @F; next if grep { $_ < 50 or $saw{$_}++ } @F; print ' input.txt
这基本上可以翻译为:
#!/usr/bin/env perl
use strict;
while (<>) {
my @F = split(' '); # split the current line
my %seen;
next if $. == 1; # skip the heading
shift @F; # ignore first element
next if grep { $_ < 50 or $seen{$_}++ } @F; # ignore lines with
# duplicate entries and
# entries less than 50
print; # print current line
}
答案2
这可能对你有用(GNU sed):
sed '1d;/\S\+ \(\S\+\) .* \1/d;/\S\+ \S\+ \(\S\+\) .* \1/d;/\S\+ \S\+ \S\+ \(\S\+\) .* \1/d;/\S\+\( \(100\|[56789][0-9]\..\)\)\{4\}/!d' file
答案3
我们可以将每个字段与行中的其他字段比较是否不相等,也可以比较每个字段是否大于 50 个值
awk '($2!=$3) &&($2!=$4) && ($2!=$5) && ($3!=$4) &&($3!=$5) &&($4!=$5) && ($2>50) && ($3>50) && ($4>50) && ($5>50) {print $0}' input.txt
PS:我假设列数是固定的。