使用其他文件中的数据从列中删除数据并删除该行

时间:2015-02-12 11:19:33

标签: csv awk grep

我有几个文件: 文件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列的值与file2中的值进行比较来删除行?

我也为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

1 个答案:

答案 0 :(得分:0)

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

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