使用另一个文件中的数据从列中删除数据并删除行
Remove data from column using data from another file and deleting the row
我有几个文件:
文件 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
我尝试使用文件 2 和 grep 从文件 1 中删除行:
grep -vif file2 file1 >outputFile
但是因为有时第 6 列中的值可能与第 2 列中的值相似,所以文件没有按照我希望的方式进行清理。如何通过比较文件 1 中第 2 列的值与文件 2 中的值来删除行?
我也为 awk
找到了这样的解决方案,但它对我的情况没有用(文件 2 包含大约 3000 个值):
awk -F, ' == anyValue' yourFileToFilter
有什么方法可以修改命令吗?或者任何其他解决方案?
更新
我也找到了this solution,它似乎和我需要的很相似,但是没有用。
$ awk -F, 'NR==FNR{a[];next}!( 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
如果您的数据在字段本身之前包含 spaces,您可以将字段分隔符设置为 space 加上一些 spaces:
awk -F"[, ]+" 'FNR==NR {a[[=10=]]=[=10=]; next} !( in a)' f2 f1
为您更新的输入 returns:
$ awk -F"[, ]+" 'FNR==NR {a[[=11=]]=[=11=]; next} !( 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
我有几个文件: 文件 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
我尝试使用文件 2 和 grep 从文件 1 中删除行:
grep -vif file2 file1 >outputFile
但是因为有时第 6 列中的值可能与第 2 列中的值相似,所以文件没有按照我希望的方式进行清理。如何通过比较文件 1 中第 2 列的值与文件 2 中的值来删除行?
我也为 awk
找到了这样的解决方案,但它对我的情况没有用(文件 2 包含大约 3000 个值):
awk -F, ' == anyValue' yourFileToFilter
有什么方法可以修改命令吗?或者任何其他解决方案?
更新
我也找到了this solution,它似乎和我需要的很相似,但是没有用。
$ awk -F, 'NR==FNR{a[];next}!( 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
如果您的数据在字段本身之前包含 spaces,您可以将字段分隔符设置为 space 加上一些 spaces:
awk -F"[, ]+" 'FNR==NR {a[[=10=]]=[=10=]; next} !( in a)' f2 f1
为您更新的输入 returns:
$ awk -F"[, ]+" 'FNR==NR {a[[=11=]]=[=11=]; next} !( 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