Find
查找具有特定匹配模式的重複文件名
我有一個包含一些文件的文件夾(文件夾內容的片段)
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”語句中看到這些欄位時,將執行列印語句。