2016-06-20 9 views
-1

に同じ外積の値を持つレコードを削除しますなどFILE1.TXTのレコード:コマンドを使用してFILE2.TXT> AWK

サンプルデータセット

r1 
r2 
r3 

私は

を取得
r1 r1 
r1 r2 
r1 r3 
r2 r1 
r2 r2 
r2 r3 
r3 r1 
r3 r2 
r3 r3 

私は上のR1、R1、R2、R2、レコードとしたくない...

その可能右の場合外積をしながら、どのように私は期待される結果を得るのですか?私は、各レコード1のシリアル番号を持っているので、

if($i!=$(i+12)){print $0;} and 

if($1!=$13){print $0;} 

:いない場合は、どのように私は999

-j FILE1.TXTを{、}参加処理した後、レコードを削除するには、私は他のawkコマンドでこれを試してみました2,3、... 私のようにFILE2.TXTています

c1 c13 --> column 1 and column 13 
1 1 
1 2 
1 3 
1 4 
2 1 
2 2 
2 3 
2 4 
3 1 
3 2 
3 3 
3 4 

私は単にシリアル番号を比較し、彼らはそれらのレコード等しい印刷されていない場合。 !あなたはそれが$ 1 = $ 13前に、すべてのレコードをスキップ見ることができます

1 2 
1 3 
1 4 
2 3 
2 4 
3 4 

: が、私は、次のような望ましくない結果を取得します。

2 1 
3 1 
3 2 

それが唯一のパターンで、R1、R1、R2、R2、...

更新

image

第一

と13日のレコードをスキップする必要がありますので、同様に欠落している行がありますcolは通し番号です。

+0

[MCVE]示す更新してください:R1、R2、R3が返すと、あなたの指定したファイルの場合

それ以外の場合は、解決策に取り組むことは困難です。 – fedorqui

答えて

1

だけループを二回ファイルを使用して:最初の時間を読んだとき

awk 'FNR==NR {a[FNR]=$0; next} 
    BEGINFILE{lines=NR-FNR} 
    { 
     for (i=1;i<=lines;i++) { 
      if (i!=FNR) print $0, a[i] 
     } 
    }' file file 

これは、配列a[line_number]=value_on_that_lineにデータを格納します。次に、2回目の読み込み時には、行番号がインデックスに一致する場合を除いて、つまり同じ行にマップされている場合を除いて、すべてのペアを印刷する行数だけループします。 。 - とテキストではなく画像で

$ awk 'FNR==NR {a[FNR]=$0; next} BEGINFILE{lines=NR-FNR} {for (i=1;i<=lines;i++) { if (i!=FNR) print $0, a[i]}}' f f 
r1 r2 
r1 r3 
r2 r1 
r2 r3 
r3 r1 
r3 r2 
+0

私は試していますが、私は400万レコードあります。私はr1とr2がそれぞれ16 colsを持っている合計で26 colsを持っています。そして、それは多くの時間を取っています。あなたが提供したものよりも効率的な取り外し方法がありますか?ちょうど$ i == $(i + 12)と比べてみましょう。レコードが最初の13のフィールドが次の13のフィールドと一致する場合、各レコードに等しいとみなされます。行を削除しますか?削除されたものは何も印刷されませんか? –

+0

@ MuridharFichadia:両方の列番号が固定されていますか? col 1と10のような? – Inian

+0

@Inian画像を確認してください –

関連する問題