【问题标题】:Remove data from column using data from another file and deleting the row使用另一个文件中的数据从列中删除数据并删除该行
【发布时间】:2015-02-12 20:01:59
【问题描述】:

我有几个文件: 文件 1:

1    2    3     4  5     6
ALA, 002, 2fv9, H, N,   O6   
ALA, 002, 2fv9, N, CA,   C20  
ALA, 002, 2fv9, N, CA,   O6   
ALA, 002, 2fv9, N, N,   O6   
ALA, 00G, 3fuj, N, CB,   C2   
ALA, 00G, 3fuj, N, CB,   C3   
ALA, 00G, 3fuj, N, N,   O10  
ALA, 010, 4ii8, N, C,   C1   
ALA, 010, 4ii8, N, O,   C  

文件 2:

003
00G
010
017

我尝试使用带有 grep 的文件 2 从文件 1 中删除行:

grep -vif file2 file1 >outputFile

但是因为有时第 6 列中的值可能与第 2 列中的值相似,所以文件没有按照我希望的方式进行清理。如何通过比较文件 1 中第 2 列的值与文件 2 中的值来删除行?

我也为awk找到了这样的解决方案,但在我的情况下它没有用(文件2包含大约3000个值):

awk -F, '$2 == anyValue' yourFileToFilter

有没有办法修改命令?还是其他解决方案?

更新

我还找到了this solution,它似乎与我需要的非常相似,但它不起作用。

$ awk -F, 'NR==FNR{a[$1];next}!($2 in a)' file2 file1 > file3

但是file3的输出是这样的:

1    2    3     4  5     6
ALA, 002, 2fv9, H, N,   O6   
ALA, 002, 2fv9, N, CA,   C20  
ALA, 002, 2fv9, N, CA,   O6   
ALA, 002, 2fv9, N, N,   O6   
ALA, 00G, 3fuj, N, CB,   C2   
ALA, 00G, 3fuj, N, CB,   C3   
ALA, 00G, 3fuj, N, N,   O10  
ALA, 010, 4ii8, N, C,   C1   
ALA, 010, 4ii8, N, O,   C 

更新:

我刚刚从文件中删除了所有空格,所以现在看起来像:

ALA,002,2fv9,H,N,O6
ALA,002,2fv9,N,CA,C20
ALA,002,2fv9,N,CA,O6
ALA,002,2fv9,N,N,O6
ALA,00G,3fuj,N,CB,C2
ALA,00G,3fuj,N,CB,C3
ALA,00G,3fuj,N,N,O10

而输出仍然是:

ALA,002,2fv9,H,N,O6
ALA,002,2fv9,N,CA,C20
ALA,002,2fv9,N,CA,O6
ALA,002,2fv9,N,N,O6
ALA,00G,3fuj,N,CB,C2
ALA,00G,3fuj,N,CB,C3
ALA,00G,3fuj,N,N,O10
ALA,010,4ii8,N,C,C1

【问题讨论】:

    标签: csv awk grep


    【解决方案1】:

    如果您的数据在字段本身之前包含空格,您可以将字段分隔符设置为一个空格加上一些空格:

    awk -F"[, ]+" 'FNR==NR {a[$0]=$0; next} !($2 in a)' f2 f1
    

    对于您更新的输入,它会返回:

    $ awk -F"[, ]+" 'FNR==NR {a[$0]=$0; next} !($2 in a)' f2 f1
    1    2    3     4  5     6
    ALA, 002, 2fv9, H, N,   O6   
    ALA, 002, 2fv9, N, CA,   C20  
    ALA, 002, 2fv9, N, CA,   O6   
    ALA, 002, 2fv9, N, N,   O6
    

    【讨论】:

    • 试过了。对我不起作用。输出再次包含所有内容:它可以离开 010,但不能离开 002。
    • 正如我在答案中所说,您是否有“干净”的数据或每个字段都包含一些空格?
    • 在文件 1 中有一个空格:ALA, 002, 在文件 2 中的 ALA,002 之间(过滤器)只有 \n
    • 当然这样不行,文件 2 没有空格,文件 1 在每个字符前都有一个空格。只需将 FS 更改为 [, ]+
    • @JID 是的,在答案文本中我解释说我最初假设是干净的数据。然后事实证明并非如此,所以我更新了一些清洁。但是你的建议更简洁,谢谢!我正在更新它。
    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多