Linux文件之间的字符串匹配

时间:2013-04-12 15:28:14

标签: file grep pattern-matching

我有两个我要比较的文件。第一个是制表符分隔,第二个是逗号分隔,都以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固定模式 - 仅与这些文件匹配的单词

但我什么都没输出...... 有没有人对如何改进这个有任何建议?我确实考虑过正则表达式,但我对它的使用并不十分精通。我不介意使用它。

2 个答案:

答案 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”更强大的解决方案。