假设有一个nowcoder.txt,编写脚本,打印只有一个数字的行。
假设nowcoder.txt内容如下:
haha12abcd77
那么你的脚本应该输出
12ab
while read line; do
out=${line//[^0-9]/} # 进行字符串替换,去除非数字字符
if [ ${#out} -eq 1 ]; then # 计算数字字符长度并输出
echo $line
fi
done < nowcoder.txt
while read line
do
count=0
for ((i=0;i<${#line};i++))
do
[[ ${line:i:1} =~ [0-9] ]] && ((count++))
done
if [ $count -eq 1 ];then
printf "$line\n"
fi
done < nowcoder.txt 纯awk awk -F "" '{
for (i=1; i<=NF; i++) {
if ($i ~ /[0-9]/) {
k++
}
}
if (k==1){print($0)}
k=0
}' #!/bin/bash
while IFS= read -r line; do
temp=$(echo "$line" | tr -dc "0-9")
if [ ${#temp} -eq 1 ]; then
echo "$line"
fi
done <nowcoder.txt
# 方法1:使用while read line
while read -r line; do
# 将每行的数字的过滤出来,并得出数量
num=$(echo "${line}" | grep -o [0-9] | wc -l)
# 如果数量不是1则continue
[[ ${num} -ne 1 ]] && continue
echo "$line"
done < nowcoder.txt
# 方法2: 使用awk
# 使用awk逐行遍历,在每行处理中逐个字符处理,
awk -F "" 'BEGIN{}{
k=0;
for(i=1;i<=NF;i++){
if($i ~ /[0-9]/) {
k++
}
}
if(k==1) {
print $0
}
}END{}' nowcoder.txt
# 因为用不到BEGIN和END,则可以选择继续进化
awk -F "" '{
k=0;
for(i=1;i<=NF;i++){
if($i ~ /[0-9]/) {
k++
}
}
if(k==1) {
print $0
}
}' nowcoder.txt
# 发现上面的复杂度还是挺高的,继续优化, 通过if(k>=2)降低遍历次数降低复杂度
awk -F "" '{
k=0;
for(i=1;i<=NF;i++){
if($i ~ /[0-9]/) {
k++
}
if(k>=2){
next
}
}
if(k==1) {
print $0
}
}' nowcoder.txt