如何确定 files/folders 是否具有升序编号模式?
How determine if files/folders have a ascending order numbering pattern?
我正在尝试确定目录中存在的所有 files/folders 是否在其名称中的同一位置具有升序编号模式
如果数字在每种情况下都始终出现在固定位置,这将非常容易
ls $HOME/dir
1. Some String
2. Some String- Part 4
3. Some String- Part 5
在这里我只是简单地使用类似
ls $HOME/dir | sort -V | grep -Eo '^[0-9]'
该命令将输出 1 2 3 并且 files/folders 具有升序编号模式是一个简单的结论
现在这里有 2 个问题:
- 这些数字不一定像上面那样总是在开头
- 中间有时会有随机数
==========================================
ls $HOME/dir
Lecture 1 - Some String
Lecture 2 - Some String - Part 4
Lecture 3 - Some String - Part 5
预期输出 - 1 2 3
我主要的事情是,我需要 grep 只输出数字,如果它们以升序出现 在文件名中的相同位置 整个
==========================================
ls $HOME/dir
1. Some String
Some String - Part 2
Some String - Part 3
对于这样的东西,grep 根本不应该输出任何东西,因为即使它的名称中有递增的数字,它们也不会始终出现在同一个地方
==========================================
PS / 我所有示例中的 'Some String' 部分对于每个 file/folders 都是不同的。仅考虑升序数字的位置不变(如果有)
再举一个例子
ls $HOME/dir
CB) Lecture 1 xyz
CB) Lecture 2 abc-part 8
CB) Lecture 3 pqr-part 9
预期输出 - 1 2 3
这是一个使用 AWK 的解决方案:
printnumbers.awk
BEGIN {
numberRegex = "[0-9]+([^A-Za-z0-9]|$)"
}
NR == 1 {
numberPos = match([=10=], numberRegex)
}
match([=10=], numberRegex) == numberPos {
matchedString = substr([=10=], RSTART, RLENGTH)
match(matchedString, "[0-9]+")
result = result substr(matchedString, RSTART, RLENGTH) "\n"
next
}
{
result = ""
exit 1
}
END {
printf("%s", result)
}
然后运行
$ ls $HOME/dir | sort -V | awk -f printnumbers.awk
编辑 2021-05-14
第二种方法是将每一行拆分为以非数字作为分隔符的字段。那么每个字段要么是一个数字,要么是一个空字符串。对于每一行,我们检查字段以查看是否形成了从一个开始的连续数字序列。
逻辑如下:
BEGIN {
FS = "[^0-9]+"
}
{
for (i = 1; i <= NF; i++) {
numbersConsecutive[i] = ($i == NR) && ((NR == 1) || numbersConsecutive[i])
}
if (NF > numbersConsecutiveLen) {
numbersConsecutiveLen = NF
}
}
END {
consecutiveNumbersFound = 0
for (i = 1; i <= numbersConsecutiveLen; i++) {
if (numbersConsecutive[i]) {
consecutiveNumbersFound = 1
}
}
if (consecutiveNumbersFound) {
for (i = 1; i <= NR; i++) {
print i
}
}
}
我正在尝试确定目录中存在的所有 files/folders 是否在其名称中的同一位置具有升序编号模式
如果数字在每种情况下都始终出现在固定位置,这将非常容易
ls $HOME/dir
1. Some String
2. Some String- Part 4
3. Some String- Part 5
在这里我只是简单地使用类似
ls $HOME/dir | sort -V | grep -Eo '^[0-9]'
该命令将输出 1 2 3 并且 files/folders 具有升序编号模式是一个简单的结论
现在这里有 2 个问题:
- 这些数字不一定像上面那样总是在开头
- 中间有时会有随机数
==========================================
ls $HOME/dir
Lecture 1 - Some String
Lecture 2 - Some String - Part 4
Lecture 3 - Some String - Part 5
预期输出 - 1 2 3
我主要的事情是,我需要 grep 只输出数字,如果它们以升序出现 在文件名中的相同位置 整个
==========================================
ls $HOME/dir
1. Some String
Some String - Part 2
Some String - Part 3
对于这样的东西,grep 根本不应该输出任何东西,因为即使它的名称中有递增的数字,它们也不会始终出现在同一个地方
==========================================
PS / 我所有示例中的 'Some String' 部分对于每个 file/folders 都是不同的。仅考虑升序数字的位置不变(如果有)
再举一个例子
ls $HOME/dir
CB) Lecture 1 xyz
CB) Lecture 2 abc-part 8
CB) Lecture 3 pqr-part 9
预期输出 - 1 2 3
这是一个使用 AWK 的解决方案:
printnumbers.awk
BEGIN {
numberRegex = "[0-9]+([^A-Za-z0-9]|$)"
}
NR == 1 {
numberPos = match([=10=], numberRegex)
}
match([=10=], numberRegex) == numberPos {
matchedString = substr([=10=], RSTART, RLENGTH)
match(matchedString, "[0-9]+")
result = result substr(matchedString, RSTART, RLENGTH) "\n"
next
}
{
result = ""
exit 1
}
END {
printf("%s", result)
}
然后运行
$ ls $HOME/dir | sort -V | awk -f printnumbers.awk
编辑 2021-05-14
第二种方法是将每一行拆分为以非数字作为分隔符的字段。那么每个字段要么是一个数字,要么是一个空字符串。对于每一行,我们检查字段以查看是否形成了从一个开始的连续数字序列。
逻辑如下:
BEGIN {
FS = "[^0-9]+"
}
{
for (i = 1; i <= NF; i++) {
numbersConsecutive[i] = ($i == NR) && ((NR == 1) || numbersConsecutive[i])
}
if (NF > numbersConsecutiveLen) {
numbersConsecutiveLen = NF
}
}
END {
consecutiveNumbersFound = 0
for (i = 1; i <= numbersConsecutiveLen; i++) {
if (numbersConsecutive[i]) {
consecutiveNumbersFound = 1
}
}
if (consecutiveNumbersFound) {
for (i = 1; i <= NR; i++) {
print i
}
}
}