如何在单个 awk 命令中组合多个正则表达式条件?



键入shell命令,该命令表示它在特定文件中具有空格的次数,并且它至少由四个数字组成(例如:" 1945 "(。 当我尝试解决上述练习时,我无法达到我想要的结果,我需要您在这个问题上的帮助。 首先,我创建了一个 txt 文件并用随机数填充它。- 符号代表空格。

---234352432- 
-123---
-12342---
-1-
-12345-
122333

我制作了一个代码来查找超过 4 位数字的数字计数,并且在数字前后都有空格。

cat text1.txt | awk '/^[[:space:]]&&[0-9]{4,}&&[[:space:]]$/' | awk 'END {print NR}'

返回 0

cat text1.txt | awk '/^" "/' | awk '/[0-9] {4, }/' | awk '/" "$/' | awk '{print NR}'

返回 6

这可能更容易grep

$ grep -Ec 's[0-9]{4,}s' file
3

验证匹配项

$ grep -E 's[0-9]{4,}s' file | tr ' ' '-'
---234352432--
-12342---
-12345-

要匹配以空格开头的行,然后有 4 个或更多连续数字,然后是到行尾的空格:

$ awk '/^[[:space:]]+[0-9]{4,}[[:space:]]+$/{c++} END{print c+0}' file
3

要匹配以空格开头的行,则以空格结尾,并在行的某处包含 4 个或更多连续数字:

$ awk '/^[[:space:]]+/ && /[0-9]{4,}/ && /[[:space:]]+$/{c++} END{print c+0}' file
3

它们的行为与您提供的输入相同,但请尝试使用它们:

3 foo 12345 bar 7    

例如(该行的开头和结尾有空格(。

你永远不需要将文件cat到awk(或任何其他命令(的管道中,也不需要多个awk命令的管道(也不需要awk+sed+grep等的管道(,所以如果你发现自己在做任何这些事情,就知道你使用了错误的方法。

$ awk '{for(i=1; i<=NF; i++) {if($i ~ /^[0-9]/&&$i>999) {print $i}}}' text1.txt >> text2.txt | awk 'END {print NR}' text2.txt

这对我的案子有效。谢谢你的一切

最新更新