2016-04-27 5 views
0

キーとして$ 1と$ 4に基づいて比較する2つのファイルがあります。両方のファイルでキーとして$ 1とキーが一致する場合、ファイル2から$ 4文字列がFile1の で$ 4に存在しない場合は、行を削除することを第二の条件を適用するとキーと文字列に基づいて2つのファイルを比較する方法+ awk

File1.txt 
ID_41088912_41091911 2999 4 BAD016,BAD036,BBD052 7 
ID_73937477_73940042 2565 3 BAD016,BAD036,BAD052 7 
ID_32904202_32912400 8198 4 BAD016,BAD036,BAD052 7 

File2.txt 
ID_41088912_41091911 2998 4 BAD016 7 
ID_73937477_73940042 2565 3 AAAD016 7 
ID_32904202_32912400 8198 4 BAD036 7 

検索:以下のサンプルファイルがありますfile1から

file1の2番目の行が$ 4で「AAAD016」、ファイル2が$ 4、File1に存在しません。

+0

私は$ 1キーを見つけるのがうまくいかず、2番目の部分は成し遂げられませんでした! – chas

答えて

0

この一致は、配列にレコード番号でインデックス付けされた関連フィールドを入力することによって行うことができます。次のスクリプトでは、1つの入力フィールド4がコンマで区切られたフィールド4に対して正規表現として一致し、フィールド1は単純に等価性がテストされます。ライン・バイ・ラインは、getlineを使用してファイルを読みながら

NR == FNR { 
    # Check that $4 can be used as a pattern, this check 
    # can be ommitted if the input is always valid. 
    if ($4 !~ /^[[:alnum:]]+$/) 
     exit 65; # EX_DATAERR 
    a[NR] = $1; 
    b[NR] = $4",|,"$4"|^"$4"$"; 
    next; 
} $1 == a[FNR] && $4 ~ b[FNR] 

上記スクリプトは、大きなファイルについて


awk -f script file2 file1 
file2

で呼び出されるべきであり、同様の処理を適用することができます。

BEGIN { 
    if (ARGC != 3) 
     exit 64; # EX_USAGE 
    while (getline <ARGV[1]) { 
     a = $1; 
     b = $4",|,"$4"|^"$4"$"; 
     # Check that $4 can be used as a pattern, this check 
     # can be ommitted if the input is always valid. 
     if (b !~ /^[[:alnum:]]+$/) 
      exit 65; # EX_DATAERR 
     getline <ARGV[2]; 
     if ($1 == a && $4 ~ b) 
      print; 
    } 
    exit; 
} 
+0

タブ区切りファイルでは機能しませんか? -F "\ t"で試しました – chas

+0

@chasどちらもタブ区切りファイルで動作するはずですが、フィールド区切り文字がタブのみの場合は、スペース/タブファイルが混在する場合に問題が発生することがあります。 – kdhp

+0

@chas一行の例にはタイプミスがあり、削除されています。 – kdhp

関連する問題