Shell-Script

在文件中的特定列上使用 Diff

  • December 17, 2014

是否可以在文件中的特定列上使用差異?

文件 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

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