2

我有两个名为“fileA.txt”和“fileB.txt”的文件。

fileA.txt 有以下内容:

1   Arizona   ABDJAQ   224
2   Ohio      AKOGFR   458
3   Wisconsin EFGTAP   871
4   Colorado  NAHBAX   991

上面四列分别是“ID”、“State”、“Pattern”、“Number”

fileB.txt 有以下内容:

1   Arizona   NKIGAB   763
2   Ohio      BAVYAD   918
3   Wisconsin AUOBAQ   547
4   Colorado  INABEA   622

同样,四列是“ID”、“State”、“Pattern”、“Number”

现在这就是我想要做的:

我想先扫描“fileA.txt”并删除“模式”列只有一个“A”的所有记录。保留所有有 2 个“A”的记录。所以我会删除俄亥俄州和威斯康星州。(ID“2”和ID“3”)。同时,我也想同时从“fileB.txt”中删除这些ID!(尽管在 fileB 中,俄亥俄州和威斯康星州的模式中有 2 个“A”)。

完成此步骤后,我的“fileA.txt”应如下所示:

1   Arizona   ABDJAQ   224
4   Colorado  NAHBAX   991

我的“fileB.txt”应该是这样的:

1   Arizona   NKIGAB   763
4   Colorado  INABEA   622

接下来,我想扫描“fileB.txt”以删除所有模式为“A”的记录,并从“fileA.txt”中删除相应的记录。(在本例中为 Arizona,因为它在 fileB 中只有“A”,因此我们从 fileB 和 fileA 中删除了 Arizona。)

在这一步之后,我将在每个文件中只留下一条记录:

“fileA.txt”将有:

4   Colorado  NAHBAX   991

和“fileB.txt”将有

4   Colorado  INABEA   622

所以,简而言之,我想扫描这两个文件并只保留那些在两个文件中的模式中有 2 个“A”的记录。

是否有单行 Unix 命令或相对简单的方法来执行此操作?

感谢帮助!

4

1 回答 1

0

为此,我用 Python( 280 个字符的代码)编写了单行代码。

python -c"import re,sys;o=lambda f,m:open(f,m);x=lambda h:[i for i in o(h,'r').readlines()];y=lambda s:len(re.findall(r'(\w+)',s)[2].split('A'))>2;z=lambda f,s:o(f,'a'if len(s)else'w').write(s);a,b=sys.argv[1:3];w=zip(x(a),x(b));z(a,'');z(b,'');[(z(a,c),z(b,d))for(c,d)in w if y(c)and y(d)]" a.txt b.txt

注意:此代码不会关闭文件描述符。我认为操作系统会这样做。

于 2014-03-25T22:40:12.743 回答