【问题标题】:Removing contents of two files at the same time - UNIX同时删除两个文件的内容 - UNIX
【发布时间】:2012-09-18 14:16:50
【问题描述】:

我有两个名为“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 命令或相对简单的方法来执行此操作?

感谢您的帮助!

【问题讨论】:

  • 我敢打赌,有人会为此想出一个awk 单行字。
  • 我希望如此。我为此编写了一个 Python 脚本,但是,我真的很想要一个单行。
  • Python 脚本还不错。你为什么想要一个单线器?这似乎不是一个简单的操作——你用了整个屏幕来描述它:)。

标签: file design-patterns


【解决方案1】:

为此,我在 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2012-06-20
    相关资源
    最近更新 更多