2

「fileA.txt」と「fileB.txt」という2つのファイルがあります。

fileA.txtの内容は次のとおりです。

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

上記の4つの列は、「ID」、「State」、「Pattern」、「Number」です。

fileB.txtの内容は次のとおりです。

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

ここでも、4つの列は「ID」、「State」、「Pattern」、「Number」です。

これが私がやりたいことです:

最初に「fileA.txt」をスキャンして、「Pattern」列に「A」が1つしかないすべてのレコードを削除したいと思います。2つの「A」を含むすべてのレコードを保持します。だから私はオハイオとウィスコンシンを削除します。(ID「2」およびID「3」)。同時に、これらのIDも「fileB.txt」から同時に削除したい!! (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」が1つあるパターンのレコードをすべて削除し、対応するレコードを「fileA.txt」から削除します。(この場合、fileBには「A」しかないためArizonaであるため、fileBとfileAの両方からArizonaを削除します。)

この手順の後、各ファイルに1つのレコードしか残されません。

「fileA.txt」には次のようになります。

4   Colorado  NAHBAX   991

と「fileB.txt」は

4   Colorado  INABEA   622

つまり、簡単に言うと、両方のファイルをスキャンして、パターンに2つの「A」が含まれるレコードのみを両方のファイルに保持したいと思います。

これを行うための1行の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

注: このコードはファイル記述子を閉じません。OSがそうしていると思います。

于 2014-03-25T22:40:12.743 に答える