2つの異なるファイルの2つの列を比較し、新しいファイルに出力を表示します。

2つの異なるファイルの2つの列を比較し、新しいファイルに出力を表示します。

ファイル1.txt

psid   task   status 

1       a1      run
2       a2      run
3       a3      stop
4       a4      run     
5       a5      stop

ファイル2.txt

a1      stop
a2      stop
a3      run
a4      run 
a5      stop

出力 -

task    status      ok
a1      run         nok
a2      run         nok
a3      stop        nko
a4      run         ok  
a5      stop        ok

ファイル1とファイル2のタスクとステータスの列を比較し、タスクとステータスを含む新しいファイルにデータを表示し、等しい場合は「ok」、等しくない場合は「nok」と表示します。

これは私が試したことですが、false 条件では機能しますが、true の場合も false が表示されます。

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next } 
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt

答え1

それでは、何を試したか見てみましょう:

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
  • -F,フィールド区切り文字をコンマに設定しますが、ファイルを確認するとこれが間違っていることがわかります。
  • arr[$2]=$2 $1のキー フィールドは でfile2.txtあり$1、 ではありません$2
  • に割り当てるフィールドの順序がarr逆になっています。最初の部分では を割り当て$2 $1、2 番目の部分は です$2 $3が、次のようになります$3 $2。またはその逆で、最初の部分は$1 $2--
    しかし実行/停止値のみを割り当ててみてはいかがでしょうか。それで十分なはずです。

したがって、ソリューションに最も近い動作バージョンは次のようになります。

awk 'NR==FNR{ arr[$1]=$2 $1; next }
{ print $0, (arr[$2]==$3 $2?"ok":"nok") }' OFS=, file2.txt file1.txt

しかし、私はこう思います:

awk '
    NR==FNR{ arr[$1]=$2;next;}
    FNR>2{ print $2,$3,(arr[$2]==$3?"ok":"nok") }
 ' file2.txt file1.txt

関連情報