我有两个我要比较的文件。第一个是制表符分隔,第二个是逗号分隔,都以ID开头。我想匹配这些ID并做两件事。首先,我想打印出两个文件之间匹配的所有文件。然后(如果可能的话)我想打印到一个单独的文件中所有那些不匹配的文件。 文件看起来像这样: (以逗号分隔)
S-3DFSG,0,254654,3,e /// x, /// 5
S-8FGDG,6,464782,6,i /// n /// n /// e /// n, /// /
S-4SKDH,0,445676,3,n /// e /// p, /// /// F
(标签分隔)
S-3DGSF DG 2 5 7 DF 2 2 4684648654
S-4GXBG DF 6 2 4 FD 7 1 2415244459
S-3DFST GA 0 8 4 CF 9 8 2
我试过
grep -F -wf file1 file2 > incommon.txt
对于grep固定模式 - 仅与这些文件匹配的单词
但我什么都没输出...... 有没有人对如何改进这个有任何建议?我确实考虑过正则表达式,但我对它的使用并不十分精通。我不介意使用它。
答案 0 :(得分:1)
analyze.py:
import re
f = open('tab.txt', 'r')
data_tab = f.read()
f.close()
f = open('csv.txt', 'r')
data_csv = f.read()
f.close()
matches_tab = re.findall(r'^([^\t]+)', data_tab, re.M)
matches_csv = re.findall(r'^([^,]+)', data_csv, re.M)
common = set(matches_tab) & set(matches_csv)
not_common = set(matches_tab) ^ set(matches_csv)
f = open('common.txt', 'w')
for el in common:
f.write(el)
f.write('\n')
f.close()
f = open('not_common.txt', 'w')
for el in not_common:
f.write(el)
f.write('\n')
f.close()
将其保存在名为 analyze.py 的文件中,并使用以下命令运行脚本:
python analyze.py
将tab.txt更改为选项卡式文件名,将csv.txt更改为逗号分隔文件名,并将列表转储到工作目录中。 如果您有任何问题,请告诉我。
答案 1 :(得分:1)
如果您仍想在shell中执行此操作,对于“共同”,您可以使用:
sed 's/\([^,]*\),.*/\1/' commed.txt > __ids.txt
grep -F -f __ids.txt $f tabbed.txt
rm -f __ids.txt
和“不共同”:
sed 's/\([^,]*\),.*/\1/' commed.txt > __ids.txt
grep -F -v -f __ids.txt $f tabbed.txt
sed 's/\([^\t]*\)\t.*/\1/' commed.txt > __ids.txt
grep -F -v -f __ids.txt $f tabbed.txt
rm -f __ids.txt
其中“commed.txt”是以逗号分隔的文件,“tabbed.txt”是以制表符分隔的文件。
如果ID可能出现在第二个文件的其他位置,则可能会失败!如果ID不能被误认为正则表达式(无.
,,
,\
,*
等,则可以使用“grep”更强大的解决方案。