Shell-Script
在文件中的特定列上使用 Diff
是否可以在文件中的特定列上使用差異?
文件 1
Something 123 item1 Something 456 item2 Something 768 item3 Something 353 item4
文件2
Another 123 stuff1 Another 193 stuff2 Another 783 stuff3 Another 353 stuff4
輸出(預期)
Something 456 item2 Something 768 item3 Another 193 stuff2 Another 783 stuff3
我想要
diff
每個文件的第二列,然後,結果將包含差異列,但與整行一起。
awk
是比較文件列的更好工具。例如,請參閱答案:比較不同文件的兩列並在匹配時列印——對於列印匹配列的行,有類似的答案。由於您要列印不匹配的行,我們可以創建一個
awk
命令來列印 file2 中未在 file1 中看到第 2 列的行:$ awk 'NR==FNR{c[$2]++;next};c[$2] == 0' file1 file2 Another 193 stuff2 Another 783 stuff3
正如 terdon 在上述問題中類似解釋的那樣,
NR==FNR
: NR 是目前輸入的行號,FNR 是目前文件的行號。只有在讀取第一個文件時,兩者才會相等。c[$2]++; next
:如果這是第一個文件,則將第二個欄位保存在c
數組中。然後,跳到下一行,以便僅在第一個文件上應用。c[$2] == 0
:只有當這是第二個文件時才會執行 else 塊,因此我們檢查該文件的欄位 2 是否已經被看到(c[$2]==0
),如果已經看到,我們列印該行。在awk
中,預設操作是列印該行,因此如果c[$2]==0
為 true,則將列印該行。但是您還需要來自 file1 的行,其中第 2 列在 file2 中不匹配。這可以通過在同一命令中簡單地交換它們的位置來獲得:
$ awk 'NR==FNR{c[$2]++;next};c[$2] == 0' file2 file1 Something 456 item2 Something 768 item3
所以現在你可以通過使用
awk
兩次來生成你想要的輸出。也許有更多awk
專業知識的人可以一次性完成。您用 標記了您的問題
/ksh
,所以我假設您使用的是 korn shell。ksh
你可以為你的差異定義一個函式,比如,diffcol2
讓你的工作更容易:diffcol2() { awk 'NR==FNR{c[$2]++;next};c[$2] == 0' $2 $1 awk 'NR==FNR{c[$2]++;next};c[$2] == 0' $1 $2 }
這具有您想要的行為:
$ diffcol2 file1 file2 Something 456 item2 Something 768 item3 Another 193 stuff2 Another 783 stuff3