Find

查找具有特定匹配模式的重複文件名

  • February 3, 2014

我有一個包含一些文件的文件夾(文件夾內容的片段)

PAT1.URGRSVP.50.WR786842JOB11632.WRS20140.FILE0005.DAT
PAT1.URGRSVP.50.WR786842JOB11643.WRS20140.FILE0003.DAT
PAT1.URGRSVP.51.WR786842JOB11643.WRS29232.FILE0003.DAT
PAT1.URGRSVP.50.WR786842JOB11694.WRS20140.FILE0002.DAT
...
...
...

我的重點是第三 (50,50,51,50) 和第五 (WRS20140,WRS20140,WRS29232,WRS20140) 塊。如何編寫一個腳本來顯示具有相同第 3 塊和第 5 塊的重複文件名(第 3 塊和第 5 塊字元串組合的重複項)?

所以輸出應該在上面的例子中列出以下內容

PAT1.URGRSVP.50.WR786842JOB11643.WRS20140.FILE0003.DAT
PAT1.URGRSVP.50.WR786842JOB11694.WRS20140.FILE0002.DAT
ls *.DAT | awk -F. '{ if (c[$3$5]) print $0 ; c[$3$5]=$0}'

.在上面,awk 使用欄位分隔符查看每個文件名。如果它以前看到過第三個和第五個欄位的組合,它會列印文件名。以您的文件名作為輸入,以上產生:

PAT1.URGRSVP.50.WR786842JOB11643.WRS20140.FILE0003.DAT
PAT1.URGRSVP.50.WR786842JOB11694.WRS20140.FILE0002.DAT

更多:awk讓我們更詳細地 檢查命令:

if (c[$3$5]) print $0 ; c[$3$5]=$0

以上由兩個語句組成:一個“if”語句和一個賦值。“如果”語句是:

if (c[$3$5]) print $0

在這個語句中,c是一個“關聯數組”。這意味著你給它一個鍵,它給你一個值。我們將第三個“塊”(awk 將其稱為第三個“欄位”)$3$5作為關鍵,並且是第五個塊。如果該鍵先前未分配,則返回空 (false) 值。因此,如果之前看到過第三塊和第五塊的組合,則執行 then ,這意味著列印整個文件名。如果不是,則跳過列印語句。$3``$5``c[$3$5]``print $0

第二個說法是:

c[$3$5]=$0

這將文件的名稱 ( $0) 分配給第三和第五欄位的鍵下的關聯數組:$3$5. 因此,下次在“if”語句中看到這些欄位時,將執行列印語句。

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