Bash
如果值 1 完全匹配,則匹配 2 個文件中的 value2
我有 2 個包含列表的文件。第 1 列是使用者 ID,第 2 列是關聯值
# cat file1 e3001 75 n5244 30 w1453 500 #cat file2 d1128 30 w1453 515 n5244 30 e3001 55
要考慮的事情。
- userIds 可能不會在兩個文件中完全排序
- 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
數組索引,如果存在,則列印差異(如果沒有則不列印),並delete
s 數組元素(delete
可能是在某些 awk 實現中缺少,順便說一句)。如果不存在,請相應列印。在該END
部分中,將列印所有剩餘的數組元素,因為它們僅存在於 file1 中。