根据字符串中的位数过滤列表

根据字符串中的位数过滤列表

我有很长的条目列表记录在一个文件中,类似于这个简短的列表:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
--[SNIP]--

我想根据每个条目中的位数( set 中的字符0123456789)来过滤此列表,如果位数超过特定阈值,则保留该字符串,否则将其删除。在前面的示例中,如何保留名称中包含 18 位数字的所有条目?

预期输出:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

答案1

awk

awk -F '[[:digit:]]' 'NF > 18'

我们使用数字作为字段分隔符,因此字段的数量将是一加上数字的数量(x1y分为xy),所以上面我们正在寻找具有至少18 位数字。

(用mawk, 替换[:digit:]0-9.mawk不支持 POSIX 字符类,但[0-9]与其他实现相反,awk无论语言环境如何,它都只在 0123456789 上匹配。可移植的是,您可以使用[0123456789],或者[0-9]如果您知道文本不包含非 - ASCII 数据)。

对于有 确切地18 位数字,即:

awk -F '[[:digit:]]' 'NF == 19'

对于sed, 至少 18 位数字:

sed -e 's/[[:digit:]]/&/18;t' -e d

grep

grep -E '(.*[[:digit:]]){18}'

答案2

假设数据保存在名为 的文件中file.txt,那么您可以执行以下操作:

#!/bin/bash
cat file.txt | while IFS= read line; do

n=$(echo $line | awk '{print gsub("[0-9]", "")}')
if [[ $n -gt 17 ]]; then 

echo $line
fi
done

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

或者

awk 'gsub("[0-9]", "&") >= 18'

答案3

要查找包含 18 位 ( [0-9]) 及更多数字的行,您可以使用grep

egrep '([0-9][^0-9]*){18}'

或者

grep -E '([0-9][^0-9]*){18}'

描述

egrep与 相同grep -E

grep      # Command to filter text using regular expressions
-E        # Use extended regex

(
  [0-9]   # Exactly one digit
  [^0-9]* # 0 or more characters except digits
)           
{18}      # Find 18 times

答案4

使用perl的返回值怎么样tr(类似于使用awk的返回值gsub

$ perl -ne 'print if tr{0-9}{0-9} >= 18' file
FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

相关内容