ファイル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