0

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

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

4

2 回答 2

1

分析.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 更改为您的逗号分隔文件名,并且您的列表应该转储到工作目录中。如果您有任何问题,请告诉我。

于 2013-04-12T16:04:33.317 回答
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 不会被误认为是正则表达式(no ., ,, \,*等),则可以使用“grep”更强大的解决方案。

于 2013-04-12T17:04:34.653 回答