1

我有两个文件,A 和 B。我只需要输出不在文件 B 中的那些人,即文件 A 中的唯一行。

文件 A 看起来像:

SNP CHR GeneticDistance BP P
rs1043096 1 0.000000 111682307 1.6478397881920986E-06
rs6661407 1 0.000000 230654589 6.5655676421792970E-06
rs1822312 1 0.000000 146687250 6.9190273469706007E-06
rs7533254 1 0.000000 34181830 1.8066585187932294E-05
rs1414355 1 0.000000 89828716 2.0823984140492505E-05
rs237425 1 0.000000 94012287 4.3816651855534701E-05

文件 B 看起来像:

rs1043096
rs1822312

输出如下:

SNP CHR GeneticDistance BP P
rs6661407 1 0.000000 230654589 6.5655676421792970E-06
rs7533254 1 0.000000 34181830 1.8066585187932294E-05
rs1414355 1 0.000000 89828716 2.0823984140492505E-05
rs237425 1 0.000000 94012287 4.3816651855534701E-05

我什至不知道从哪里开始,也不知道该使用什么语言!我大概不能使用 !=in 正则表达式,否则我会得到文件中与逐行不匹配的所有其他内容,而不仅仅是文件 A 独有的行

我可以修改这样的东西吗?排序文件A 文件B | uniq -u > 文件C

或这个?我发现它很棘手,因为文件 A 和 B 中的行看起来并不相同。

open(FILE1, "< fileA.txt");
open(FILE2, "< fileB.txt");

@file1 = <FILE1>;
@file2 = <FILE2>;

foreach $line (@file1, @file2)
{
    chomp($line);
    $TEXT{$line}++;
}

foreach $line (sort keys %TEXT)
{
    if ($TEXT{$line} == 1)
    {
         print $line . "\n";
    }
}

谢谢!

4

2 回答 2

3

如果你可以使用awk,这可以工作:

$ awk 'NR == FNR{a[$0];next} !($1 in a)' fileB fileA
SNP CHR GeneticDistance BP P
rs6661407 1 0.000000 230654589 6.5655676421792970E-06
rs7533254 1 0.000000 34181830 1.8066585187932294E-05
rs1414355 1 0.000000 89828716 2.0823984140492505E-05
rs237425 1 0.000000 94012287 4.3816651855534701E-05

代码在Idiomatic awk中进行了解释。

基本上,它遍历 fileB 并获取 fileA 中第一个字段 ( $1) 不在 fileB 中的那些行。

不要犹豫,询问您是否需要进一步的解释。但是,我认为在网络上解释得很好,我无法改进它:)

于 2013-05-29T10:27:04.297 回答
1
grep -Fv -f B A
 # or
fgrep -v -f B A

这将列出 A 中与 B 中的任何字符串都不匹配的每一行。

您可能在B匹配值的前缀时遇到短值问题,A在这种情况下,您可以在 中的每一行添加一个空格B

sed 's/$/ /' B | fgrep -v -f - A
于 2013-05-29T10:51:12.633 回答