我在 Unix 系統上有 2 個大檔案,每個檔案有數千行和大約 80 列。我已經根據一組唯一鍵對檔案進行了排序,以便我們始終比較相同的行。為了便于理解,我在這里只給出 3 行和 7 列。
檔案 1:
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRA" entity_cd="U0526"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0527"
檔案2:
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRB" entity_cd="V0528"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0530"
預期輸出:
Mismatch in row 2 : file1.src_system_id=PRA file2.src_system_id=PRB, file1.entity_cd=U0526 file2.entity_cd=V0528
Mismatch in row 3 : file1.entity_cd=U0527 file2.entity_cd=U0530
是否可以使用 bash 腳本來實作這一點?我嘗試了 AWK,它沒有給我想要的輸出-
paste -d' ' file1 file2|
awk -F' ' '{w=NF/2;
for(i=1;i<=w;i )
if($i!=$(i w)) printf "%d %d %s %s", NR,i,$i,$(i w);
print ""}'
提前致謝 !!!
uj5u.com熱心網友回復:
在每個 Unix 機器上的任何 shell 中使用任何 awk:
$ cat tst.awk
BEGIN { FS="[= ]" }
NR==FNR {
for (i=1; i<NF; i =2) {
file1[NR,i] = $(i 1)
}
next
}
{
msg = sep = ""
for (i=1; i<NF; i =2) {
if ( $(i 1) != file1[FNR,i] ) {
msg = msg sep " " ARGV[1] "." $i "=" file1[FNR,i] " " FILENAME "." $i "=" $(i 1)
sep = ","
}
}
if ( msg != "" ) {
print "Mismatch in row " FNR " :" msg ORS
}
}
$ awk -f tst.awk file1 file2
Mismatch in row 2 : file1.src_system_id="PRA" file2.src_system_id="PRB", file1.entity_cd="U0526" file2.entity_cd="V0528"
Mismatch in row 3 : file1.entity_cd="U0527" file2.entity_cd="U0530"
以上假設:
- 您參考的字串不能包含
=或空白 - 存在于 file1 行中的每個標簽也存在于 file2 的同一行中
- 標簽始終以相同的順序出現在給定的行中
- 您可以在給定行中有多個重復標簽
uj5u.com熱心網友回復:
看一下wdiff,這樣的事情可能會起作用:
$ wdiff -w$'\e[31m' -x $'\e[0m' -y $'\e[32m' -z $'\e[0m' file1 file2
選項-wxyz是分別定義洗掉和插入的前綴和后綴。在這種情況下,我們嘗試將缺失部分涂成紅色,將插入部分涂成綠色。
uj5u.com熱心網友回復:
聚會有點晚了,但是您可以做某種“嵌套差異”,其中第一個差異捕獲不同的行并將其中的每一列放在自己的一行中。然后,您執行另一個diff 以捕獲完全不同的列。它是純 bash,并且僅使用 bash 回圈grep、sed和diff.
$ for f in $(diff file1.txt file2.txt | grep -e "<"); do echo $f; done > left && for f in $(diff file1.txt file2.txt | grep -e ">"); do echo $f; done > right && diff -y left right | grep "|" | sed "s/\t>/-----/g"
< |-----
src_system_id="PRA" | src_system_id="PRB"
entity_cd="U0526" | entity_cd="V0528"
< |-----
entity_cd="U0527" | entity_cd="U0530"
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/406088.html
標籤:
上一篇:在特定情況下連接檔案串列中的檔案
下一篇:UNIX:使用tr洗掉空行
