Bash

查找具有最小 4 位數字的文件

  • March 17, 2017

我有很多很多表格文件,[a-zA-Z]+\d\.\d{2}\_\d.\d{4}.end想找到之前 4 位數字最小的文件.end。(如果發生碰撞,我想要所有文件)

你怎麼能用 Bash 做到這一點?sort顯然,由於字典順序,單獨工作是行不通的。

使用 Bashfind以及sort -t|--field-separatorand-k|--key選項:

find_files.sh:

#!/bin/bash
first_file=$(find . -iname '*.end' | sort -t '.' -k 4.1 | head -1)
IFS='.'
fields=($first_file)
unset IFS
find . -iname "*${fields[3]}.end"

-k|--key選項需要 a的KEYDEF形式field_number **。**字元號。生效時-t|--field-separator,將根據指定的分隔符(在本例中.為 )而不是空格來計算欄位編號。

然後,我們使用 Bash 的輸入欄位分隔符從第一個文件中提取所需的模式,並再次在目錄中搜尋與find該模式匹配的文件,以防多個文件共享相同的 4 位數字。

例子:

$ ls -1
abc0.03_1.1921.end
def0.03_9.0311.end
ghi0.03_1.1966.end
jkl1.04_1.1916.end
mno2.04_4.9540.end
pab9.04_1.1994.end
uvx7.04_3.2002.end
yyy1.05_8.0311.end
zzz4.04_1.2097.end
$ ./find_files.sh
./yyy1.05_8.0311.end
./def0.03_9.0311.end

使用 GNU 工具,您可以執行以下操作:

find . -regextype posix-extended \
 -regex '.*/[a-zA-Z]+[0-9]\.[0-9]{2}_[0-9]\.[0-9]{4}\.end' -print0 |
 awk -v RS='\0' -F . '
   NR == 1 || $(NF-1) < min {files=$0; min = $(NF-1); next}
   $(NF-1) == min {files = files "\n" $0}
   END {if (NR) print files}'

這是一個常見模式的範例:我們列印以 NUL 分隔的匹配文件列表(因為 NUL 是文件路徑中唯一不能出現的字元)並處理該輸出,awk其中記錄分隔符已設置為 NUL (並非所有awk實現都支持這一點)。

欄位分隔符設置.為。NF是欄位數,$(NF-1)最後一個欄位也是如此。awk通過與最後一個已知值比較找到最小的數字,並將相應的文件儲存在 files awk變數中。

當我們儲存列表換行符而不是 NUL 分隔時,這僅用於使用者輸出。如果您想可靠地對其進行後處理,則需要改用 NUL("\0"在 awk 中)。

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