値1が正確に一致すると、2つのファイルの値2と一致します。

値1が正確に一致すると、2つのファイルの値2と一致します。

リストを含むファイルが2つあります。列 1 はユーザー ID、列 2 は関連値です。

# cat file1
e3001 75
n5244 30
w1453 500

#cat file2
d1128 30
w1453 515
n5244 30
e3001 55

考慮すべき事項。

  1. 両方のファイルの userId が正しくソートされていない可能性があります。
  2. ファイルの userId 数は異なる場合があります。

必須

  • まず、file1:column1のuserIdはfile2:column1のUserIdと一致する必要があります。
  • 次に、file1:column2の値をfile2:column2の値と比較します。
  • 値に違いがある場所を印刷します。および追加のuserId(存在する場合)

出力:

e3001 has differnece, file1 value: 75 & file2 value: 55
w1453 has differnece, file1 value: 500 & file2 value: 515
d1128 is only present in filename: file1|file2

1liner-awkまたはbashループソリューションへようこそ。

ループを試していますが、ゴミが吐き出しています。論理エラーがあるようです。

#!/usr/bin/env bash

## VARIABLES
FILE1=file1
FILE2=file2
USERID1=(`awk -F'\t' '{ print $1 }' ${FILE1}`)
USERID2=(`awk -F'\t' '{ print $1 }' ${FILE2}`)
USERDON1=(`awk -F'\t' '{ print $2 }' ${FILE1}`)
USERDON2=(`awk -F'\t' '{ print $2 }' ${FILE2}`)

for user in ${USERID1[@]}
do
    for (( i = 0; i < "${#USERID2[@]}"; i++ ))
    #for user in ${USERID2[@]}
    do
        if [[ ${USERID1[$user]} == ${USERID2[i]} ]]
        then
            echo ${USERID1[$user]} MATCHES BALANCE FROM ${FILE1}: ${USERDON1[$i]} WITH BALANCE FROM ${FILE2}: ${USERDON2[$i]}
        else
            echo ${USERID1[$user]} 
        fi
    done
done

以下は、Linuxボックスから直接コピーしたファイルです。タブで区切られていますが、私が知っている限り、awkはタブも使用できます。

#cat file1
e3001   55
n5244   30
w1453   515

ベストアンサー1

さて、言うと、あなたの台本は風光明媚な道を選びます。簡単な方法はどうですかawk?良い

awk '
NR==FNR         {ARR[$1] = $2
                 F1      = FILENAME
                 next
                }
($1 in ARR)     {if ($2 != ARR[$1]) print $1 " has difference," \
                                          F1 " value: " ARR[$1] \
                                          " & " FILENAME " value: " $2 
                 delete ARR[$1]
                 next
                }
                {print $1 " is only present in filename: " FILENAME
                }
END             {for (a in ARR) print a " is only present in filename: " F1
                }
' file[12]
d1128 is only present in filename: file2
w1453 has difference, file1 value: 500 & file2 value: 515
e3001 has difference, file1 value: 75 & file2 value: 55

file1のすべての内容を配列として読み込み、file2の各行について配列$1インデックスを確認し、違いがある場合は印刷し(存在しない)、配列delete要素を保存します(deleteおそらくいくつかのawkに実装がありません。btw)。存在しない場合は、それに応じて印刷してください。このENDセクションでは、残りの配列要素はすべてfile1にのみ存在するため、印刷されます。

おすすめ記事