Bash

如果值 1 完全匹配,則匹配 2 個文件中的 value2

  • April 11, 2022

我有 2 個包含列表的文件。第 1 列是使用者 ID,第 2 列是關聯值

# cat file1
e3001 75
n5244 30
w1453 500

#cat file2
d1128 30
w1453 515
n5244 30
e3001 55

要考慮的事情。

  1. userIds 可能不會在兩個文件中完全排序
  2. userId 的數量可能因文件而異

必需的

  • 首先,file1:column1 中的 userId 必須與 file2:column1 中的 UserId 匹配
  • 接下來將它們在 file1:column2 中的值與 file2:column2 進行比較
  • 列印值有差異的地方。如果有的話,還有額外的使用者 ID

輸出:

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

嗯——可以這麼說,你的劇本走的是風景優美的路線。一個簡單的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數組索引,如果存在,則列印差異(如果沒有則不列印),並deletes 數組元素(delete可能是在某些 awk 實現中缺少,順便說一句)。如果不存在,請相應列印。在該END部分中,將列印所有剩餘的數組元素,因為它們僅存在於 file1 中。

引用自:https://unix.stackexchange.com/questions/698668