我有兩個要比較的制表符分隔檔案。
我想查找 file2 中缺少的 file1 中 col1 的值(以“左”開頭)和 file2 中的 col1 中 file1 中缺少的值(以“joined”開頭)。對于這些行,我想列印 col1 和 col8。對于具有相同 col1 和不同 col8 值的行,我的 diff 命令失敗。
檔案 1:
Char1 55 Necromancer Knight A 11/21/21 Zone Char1(Main) off off 0 Char1(Main)
Char2 28 Druid Squire A 12/08/21 Zone Char1 off off 0 Char1
Char3 44 Enchanter Recruit A 08/07/21 Zone Char3(Main) off off 0 Char3(Main)
Char4 56 Enchanter Knight A 11/06/21 Zone Char4(Main) off off 0 Char4(Main)
Char5 10 Magician Recruit A 10/29/21 Zone Char1 off off 0 Char1
Char6 65 Druid Champion A 12/12/21 The Lair of the Splitpaw Char6(Main) VT emp time off off 0 Char6(Main) VT emp time
檔案2:
Char1 55 Necromancer Knight A 11/21/21 Zone Char1(Main) off off 0 Char1(Main)
Char2 28 Druid Squire A 12/08/21 Zone Char1 off off 0 Char1
Char3 44 Enchanter Recruit A 08/07/21 Zone Char3(Main) off off 0 Char3(Main)
Char4 56 Enchanter Knight A 11/06/21 Zone Char4(Main) off off 0 Char4(Main)
Char5a 10 Magician Recruit A 10/29/21 Zone Char1 off off 0 Char1
Char6 65 Druid Champion A 12/21/21 Zone Char6(Main) Emp/VT/Time off off 0 Char6(Main) Emp/VT/Time
diff 命令產生輸出:
diff --new-line-format="joined %L" --old-line-format="left %L" --unchanged-line-format="" <(cut -f1,8 "$file1" | sort) <(cut -f1,8 "$file2" | sort) | sort
電流輸出:
joined Char5a Char1
joined Char6 Char6(Main) Emp/VT/Time
left Char5 Char1
left Char6 Char6(Main) VT emp time
期望的輸出:
joined Char5a Char1
left Char5 Char1
非常感謝任何幫助,謝謝!
uj5u.com熱心網友回復:
Diff 用于簡單的差異。使用 可以更輕松地解決您的問題awk。
您不需要對檔案進行排序,只需讀取兩個檔案并計算第 1 列中的鍵出現的頻率。
在計算關鍵值的同時準備潛在的輸出。當NR==FNR您在第一個檔案中并且想要使用“左”時。
讀取兩個檔案后,查找僅出現一次的鍵并列印該行的準備輸出。
awk -F'\t' '
{
key[$1]
value[$1]=(NR==FNR ? "left " : "joined ") $1 "\t" $8
}
END {
for (i in key) {
if (key[i]==1) {
print value[i]
}
}
}' file1 file2
uj5u.com熱心網友回復:
希望這個 python 腳本得到你的期望:
#!/bin/bash
python -c '
import re, sys
def read_into_dict(regex, file):
return { re.findall(regex, line)[0]: line for line in open(file) }
regex, file1, file2 = sys.argv[1:]
dict1 = read_into_dict(regex, file1)
dict2 = read_into_dict(regex, file2)
keys1 = set(dict1.keys())
keys2 = set(dict2.keys())
for key in (keys1 - keys2):
print(f"left {dict1[key]}")
for key in (keys2 - keys1):
print(f"joined {dict2[key]}")
' '^(\S )' <(cut -f1,8 "$file1" | sort) <(cut -f1,8 "$file2" | sort) | sort
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/391309.html
下一篇:使用分支名稱提交的Git別名
