にfile1
私
1023M BLD
123G DEV
945K Deployment
4899 INT
にfile2
私
1.2G BLD
123G DEV
345M Deployment
499M INT
の最初のフィールドとの最初のフィールドをfile1
比較したいですfile2
。一致しないフィールドだけを印刷したいです。file3
答え1
サンプルファイルを使用すると、次のコマンドを使用して目的の結果を取得できます。
$ paste file1 file2 | awk '$1!=$3'
サンプル出力は次のとおりです。
1023M BLD 1.2G BLD
945K Deployment 345M Deployment
4899 INT 499M INT
file3に書き込むには、ファイルにリダイレクトを使用します。
答え2
SQL用語で考えたい場合は、必ず「」というツールを使ってみてください。キュー':
$ q 'SELECT f1.*, f2.* FROM file1 f1 JOIN file2 f2 ON f1.c2 = f2.c2 WHERE f1.c1 != f2.c1';
SQLクエリに精通している場合は、より明確で理解しやすくなります。
答え3
あまりハッキングされていない解決策と思われる場合は、diffまたはsdiffを使用し、必要に応じて出力を操作するためにawkなどを使用します。
➜ ~ sdiff 1.txt 2.txt
1023M BLD | 1.2G BLD
123G DEV 123G DEV
945K Deployment | 345M Deployment
4899 INT | 499M INT
これにより、パイプ記号の背後にあるさまざまな値を表示できます。
上記の回答に示すように、その項目だけをGrepしてください。
➜ ~ sdiff 1.txt 2.txt | grep '|'
1023M BLD | 1.2G BLD
945K Deployment | 345M Deployment
4899 INT | 499M INT
私は個人的にこれがより滑らかな解決策だと思います。リダイレクトするには:
➜ ~ sdiff 1.txt 2.txt | grep '|' > 3.txt
diffとgrepを使用して、最初の行とは異なるフィールドのみを取得することもできます。
➜ ~ diff 1.txt 2.txt | grep "^>"
> 1.2G BLD
> 345M Deployment
> 499M INT