我有几个文件: 文件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
答案 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