牛客网Shell编程练习

最近因为工作原因开始接触Linux,需要做一些简单的Shell开发。

在牛客网练习了一下,来记录自己的学习过程。

第1题:统计文件的行数

题目:

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

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int b = 100;
    cout << "a + b:" << a + b << endl;
    return 0;
}

你的脚本应当输出:
9

思路:

思路较简单。

程序:

wc -l

 第2题:打印文件的最后5行

题目:

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

 

 你的脚本应当输出:

 

 

思路:

思路较简单。

程序:

tail -5 nowcoder.txt

 第3题:输出7的倍数

题目:

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

思路:

类似其他语言,构造一个循环。

程序:

for i in {0..500..7}
do
    echo $i
done

 第4题:输出第5行的内容

题目:

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



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

你的脚本应当输出:
is

思路:

使用NR和$0

程序:

awk '{if (NR == 5) print $0}' nowcoder.txt

 第5题:打印空行的行号

题目:

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

1
2
3
4
5
6
7
8
9
10
11
a
b
 
c
 
d
 
e
 
 
f




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

思路:

使用^$

程序:

awk '/^$/ {print NR}' nowcoder.txt

 第6题:去掉空行

题目:

写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行
示例:
假设 nowcoder.txt 内容如下:

1
2
3
4
5
6
7
8
9
10
11
abc
 
567
 
 
aaa
bbb
 
 
 
ccc


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

思路:

两个思路,一个使用sed来,一个使用awk来。

程序1:

sed '/^$/d' nowcoder.txt

 程序2:

awk '{if (length($1) >= 1) print $0}'

 第7题:打印字母数小于8的单词

题目:

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



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

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

and
applied

in

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

思路:

使用awk中NF来确定字段数,并且使用判断条件来进行判断。

程序:

awk '{for(i=1;i<=NF;i++) if(length($i)<8) print $i}' nowcoder.txt

 第8题:统计所有进程占用内存大小的和

题目:

假设 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文件下面的
请你写一个脚本计算一下所有进程占用内存大小的和:

思路:

使用累计的思想。

程序:

awk 'BEGIN{sum=0} {sum=sum+$6} END{print sum}' nowcoder.txt

 第9题:去掉包含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

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

思路:

使用grep

程序:

grep -v this nowcoder.txt

 第10题:求平均值

题目:

写一个 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

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

思路:

使用NR找行,然后根据不同的情况来统计和计算数字。

程序:

awk '
BEGIN{sum=0}
{if(NR==1) {num=$0} else {sum=sum+$0}}
END{printf("%.3f",sum/num)}'

 第11题:去掉不需要的单词

题目:

写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词
示例:
假设输入如下:
big
nowcoder
Betty
basic
test


你的脚本获取以上输入应当输出:
nowcoder test

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

思路:

使用grep

程序:

grep -v 'B\|b' 

 第12题:转置文件的内容

题目:

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

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

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

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

思路:

两个循环来实现。

程序:

awk '{
    for (i=1;i<=NF;i++){
        if (NR==1){
            res[i]=$i
        }
        else{
            res[i]=res[i]" "$i
        }
    }
}END{
    for(j=1;j<=NF;j++){
        print res[j]
    }
}' nowcoder.txt

 第13题:第二列是否有重复

题目:

给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个sheel脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息:
实例:
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

思路:

使用uniq -c来统计信息。

程序:

awk '{print $2}' nowcoder.txt | sort| uniq -c| sort| grep -v '1'

 第14题:统计每个单词出现的个数

题目:

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

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

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

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

思路:

使用sort -k来指定列进行排序。

程序:

awk '{
for (i=1;i<=NF;i++)
{
    a[$i]++
}}
END{
    for(j in a)
    {
        print j,a[j]
    }
}' nowcoder.txt |sort -k 2

 今天的学习就到这里,那个原第12题有些难度,明天来研究。

怀挺~~~

第15题:打印每一行出现的数字个数

题目:

写一个 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

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

思路:

看了别人的思路,用循环来做。

程序:

awk '{
count=0;
len=length($0);
for(i=1;i<=len;i++)
    {s=substr($0,i,1)
    if(0<s && s<6)
        {total++;
        count++}}; 
        printf("line%d number:%d\n",NR,count);}
END{printf("sum is %d\n",total)}'

 

posted on 2020-11-27 21:50  桌子哥  阅读(568)  评论(0编辑  收藏  举报