SHELL编程-牛客网题目(持续更新..)

SHELL编程题目及solution (牛客网)

Q1:统计文件的行数

描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数
示例:
假设 nowcoder.txt 内容如下:

#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int b = 100;
    cout << "a + b:" << a + b << endl;
    return 0;
}

你的脚本应当输出:
9

-Answer:

#!/bin/bash
#法1
cat nowcoder.txt | wc -l
#法2
awk '{print NR}' ./nowcoder.txt |tail -n 1
#法3
grep -n "" ./nowcoder.txt
#法4
sed -n '$=' nowcoder.txt
#法5
wc -l < nowcoder.txt

Q2:打印文件的最后5行

描述:经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行

示例:
假设 nowcoder.txt 内容如下:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int b = 100;
cout << "a + b:" << a + b << endl;
return 0;
}


你的脚本应当输出:
int a = 10;
int b = 100;
cout << "a + b:" << a + b << endl;
return 0;
}

-Answer:

#!/bin/bash
#法1


Q3:输出7的倍数

描述:写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21...)的命令
-Answer:

#!/bin/bash

Q4:输出第5行的内容

描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt 中第5行的内容。

示例:
假设 nowcoder.txt 内容如下:
welcome
to
nowcoder
this
is
shell
code

你的脚本应当输出:
is

-Answer:

#!/bin/bash
#

#

#

#


Q5:打印空行的行号

描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始

示例:
假设 nowcoder.txt 内容如下:
a
b

c

d

e


f
你的脚本应当输出:
3
5
7
9
10

-Answer:

#!/bin/bash


#

Q6:去掉空行

描述:写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行

示例:
假设 nowcoder.txt 内容如下:
abc

567


aaa
bbb



ccc

你的脚本应当输出:
abc
567
aaa
bbb
ccc

-Answer:

#!/bin/bash

#

Q7:印字母数小于8的单词

描述:写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词。

示例:
假设 nowcoder.txt 内容如下:
how they are implemented and applied in computer 

你的脚本应当输出:
how
they
are
and
applied
in

说明:
不要担心你输出的空格以及换行的问题

-Answer:

#!/bin/bash



#

Q8:统计所有进程占用内存大小的和

描述
假设 nowcoder.txt 内容如下:
root         2  0.0  0.0      0     0 ?        S    9月25   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   9月25   0:00 [kworker/0:0H]
web       1638  1.8  1.8 6311352 612400 ?      Sl   10月16  21:52 test
web       1639  2.0  1.8 6311352 612401 ?      Sl   10月16  21:52 test
tangmiao-pc       5336   0.0  1.4  9100240 238544   ??  S     3:09下午   0:31.70 /Applications

以上内容是通过ps aux | grep -v 'RSS TTY' 命令输出到nowcoder.txt文件下面的
请你写一个脚本计算一下所有进程占用内存大小的和:

-Answer:

#!/bin/bash
#
#
#

Q9:统计每个单词出现的个数

描述:写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。

为了简单起见,你可以假设:
nowcoder.txt只包括小写字母和空格。
每个单词只由小写字母组成。
单词间由一个或多个空格字符分隔。

示例:
假设 nowcoder.txt 内容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
你的脚本应当输出(以词频升序排列):
to 1 
welcome 2 
nowcoder 3 

说明:
不要担心个数相同的单词的排序问题,每个单词出现的个数都是唯一的。

-Answer:

#!/bin/bash
#
#

Q10:第二列是否有重复

描述:给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个shell脚本来检查文件第二列是否有重复,
且有几个重复,并提取出重复的行的第二列信息:

实例:
20201001 python 99
20201002 go 80
20201002 c++ 88
20201003 php 77
20201001 go 88
20201005 shell 89
20201006 java 70
20201008 c 100
20201007 java 88
20201006 go 97

结果:
2 java
3 go

-Answer:

#!/bin/bash

#
#
#

Q11:转置文件的内容

描述:写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容。

为了简单起见,你可以假设:
你可以假设每行列数相同,并且每个字段由空格分隔

示例:
假设 nowcoder.txt 内容如下:
job salary
c++ 13
java 14
php 12

你的脚本应当输出(以词频升序排列):
job c++ java php
salary 13 14 12

-Answer:

#!/bin/bash
#
#
#

Q12:打印每一行出现的数字个数

描述:写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数。

示例:
假设 nowcoder.txt 内容如下:
a12b8
10ccc
2521abc
9asf
你的脚本应当输出:
line1 number: 2
line2 number: 1
line3 number: 4
line4 number: 0
sum is 7

说明:
不要担心你输出的空格以及换行的问题

-Answer:

#!/bin/bash
#
#
#

Q13:去掉所有包含this的句子

描述:写一个 bash脚本以实现一个需求,去掉输入中含有this的语句,把不含this的语句输出

示例:
假设输入如下:
that is your bag
is this your bag?
to the degree or extent indicated.
there was a court case resulting from this incident
welcome to nowcoder


你的脚本获取以上输入应当输出:
to the degree or extent indicated.
welcome to nowcoder

说明:
你可以不用在意输出的格式,包括空格和换行

-Answer:

#!/bin/bash
#
grep -v -E "this|is" nowcoder.txt
awk -F: '$0!~/this|is/{print $0}' nowcoder.txt
sed '/this\|is/d' nowcoder.txt
#

Q14:求平均值

描述:写一个bash脚本以实现一个需求,求输入的一个的数组的平均值

第1行为输入的数组长度N
第2~N行为数组的元素,如以下为:
数组长度为4,数组元素为1 2 9 8
示例:
4
1
2
9
8

那么平均值为:5.000(保留小数点后面3位)
你的脚本获取以上输入应当输出:
5.000

-Answer:

#!/bin/bash
#
awk '{if(NR==1) {N=$1} else{sum+=$1}} END{printf ("%.3f",sum/N) }'
#

Q15:去掉不需要的单词

描述:写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词

示例:
假设输入如下:
big
nowcoder
Betty
basic
test
你的脚本获取以上输入应当输出:
nowcoder test
说明:
你可以不用在意输出的格式,空格和换行都行

-Answer:

#!/bin/bash
#
grep -v [Bb] nowcoder.txt
grep -v -E 'b|B' nowcoder.txt
grep -iv "b"
cat nowcoder.txt | grep -v -E 'b|B' 
cat nowcoder.txt|grep -vi "b"
awk '$0!~/b|B/ {print $0}' nowcoder.txt
awk '!/[bB]/'
sed '/[Bb]/d'
sed '/b\|B/d'
#
#

Q16:判断输入的是否为IP地址

描述:写一个脚本统计文件nowcoder.txt中的每一行是否是正确的IP地址。

如果是正确的IP地址输出:yes
如果是错误的IP地址,四段号码的话输出:no,否则的话输出:error
假设nowcoder.txt内容如下
192.168.1.1
192.168.1.0
300.0.0.0
123
你的脚本应该输出
yes
yes
no
error

-Answer:

#!/bin/bash
#awk
awk -F'.' '{if(NF!=4){print "error";next}else{for(i=1;i<=4;i++){if(i==4){print "yes";next}else{if($i<0||$i>255){print "no";next}}}}}' nowcoder.txt
#shell
while read line
    do
        arr=(${line//./ })
        if [ ${#arr[*]} -ne 4 ];then
                printf "error\n"
            else
                for ((i=0; i<${#arr[*]}; i++))
                    do
                        [ ${arr[${i}]} -gt 255 ] && printf "no\n" && break
                    done
                    [ $i == 4 ] && printf "yes\n"
        fi
    done
#
awk -F "." '{
    if (NF == 4) {
        for (i=1; i<5; i++) {
            if ($i > 255 || $i < 0) {
                print("no");break
            }
        }
        if (i==5){print("yes")}
    } else {
        print("error")
    }
}'
#
awk -F. '{if(NF!=4){print "error";next}else{
for(i=1;i<=4;i++){
if(i==4){
if($i>=0&&$i<=255){
print "yes";next
}else{
print "no";next
}
}else{
  if($i<0 || $i>255){
  print "no";next
  }
}
}
}
}' nowcoder.txt
#

Q17:将字段逆序输出文件的每行

描述:将字段逆序输出文件nowcoder.txt的每一行,其中每一字段都是用英文冒号: 相分隔。

假设nowcoder.txt内容如下:
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
你的脚本应当输出
/usr/bin/false:/var/empty:Unprivileged User:-2:-2:*:nobody
/bin/sh:/var/root:System Administrator:0:0:*:root

-Answer:

#!/bin/bash
#
awk -F: '{
     for ( j=1;j<=NF;j++){
             if (j==1){
             str=$1;continue
             }
             str = sprintf("%s:%s",$j,str)
        }
        print(str)
}' nowcoder.txt

#

Q18:域名进行计数排序处理

描述:假设我们有一些域名,存储在nowcoder.txt里,现在需要你写一个脚本,将域名取出并根据域名进行计数排序处理。

假设nowcoder.txt内容如下:
http://www.nowcoder.com/index.html
http://www.nowcoder.com/1.html
http://m.nowcoder.com/index.html
你的脚本应该输出:
2 www.nowcoder.com
1 m.nowcoder.com

-Answer:

#!/bin/bash
#
awk -F"[/]+" '{print $2}' nowcoder.txt | sort | uniq -c | sort -nr | awk '{print $1,$2}'
#
#

Q19:打印等腰三角形

描述
打印边长为5的等腰三角形。
你的脚本应该输出
    *
   * *
  * * *
 * * * *
* * * * *

-Answer:

#!/bin/bash
#循环嵌套
for (( i=1;i<=5;i++ ));do
 for ((j=5;j>=1;j-- ));do
  if [ $j -le $i ];then
  echo -e "* \c"
  else
  echo -e " \c"
  fi
  done
 echo
done
#
#

Q20:打印只有一个数字的行

描述:假设我们有一个nowcoder.txt,现在需要你写脚本,打印只有一个数字的行。

假设nowcoder.txt内容如下
haha
1
2ab
cd
77
那么你的脚本应该输出
1
2ab

-Answer:

#!/bin/bash
#字符串切片
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
#

Q21:格式化输出

描述:我们有一个文件nowcoder.txt,里面的每一行都是一个数字串,假设数字串为“123456789”,那么我们要输出为123,456,789。

假设nowcoder.txt内容如下
1
12
123
1234
123456
那么你的脚本输出如下
1
12
123
1,234
123,456

-Answer:

#!/bin/bash
#shell版
while read line
    do
        k=0
        lStr=${#line}
        for ((i=$lStr-1; i>=0; i--))
            do
                let k++
                str="${line:i:1}$str"
                [ $(($k%3)) -eq 0 ] && [ $i -ge 1  ] && [ $lStr -gt 3 ] && str=",$str"
            done
            echo "$str"
            str=""
    done
  
#
for i in `cat nowcoder.txt`
do
  printf "%'d\n" $i
done


#awk
awk -F "" '{
   k=0
   for(i=NF;i>0;i--){
   k++
   str=sprintf("%s%s",$i,str)
   if(k%3==0 && i>=2 && NF >3){
     str=sprintf(",%s",str)
   }
   }
   print(str)
   str=""
}' nowcoder.txt
#

Q22:处理文本

描述:假设我们有一个nowcoder.txt。

假设我们有一个nowcoder.txt,假设里面的内容如下
111:13443
222:13211
111:13643
333:12341
222:12123
现在需要你写一个脚本按照以下的格式输出
[111]
13443
13643
[222]
13211
12123
[333]
12341

-Answer:

#!/bin/bash
#关联数组
cat nowcoder.txt | awk -F ":" '{
    res[$1] = (res[$1] == "" ? $2 : (res[$1] "\n" $2))
}END{
    for(k in res){
        print "["k"]"
        print res[k]
    }
}'
#
posted @ 2021-11-30 15:17  Leo'sblog  阅读(183)  评论(0编辑  收藏  举报