牛客shell练习

awk内置函数

split

格式: split(string,array,field separator) 字符串,放到哪个数组,用来分的分隔符

分隔符不给,默认是FS的

name="Tom:John:Tack"
out=`echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'`
echo $out
Tom John Tack   #被分成三个了

substr 截取字符串

格式:substr(s,p) 返回字符串s中从p开始的子串 起始为1

格式:substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

echo "123456" | awk '{print substr($0,1,1)}'
1
echo "123456" | awk '{print substr($0,2,1)}'
2
echo "123456" | awk '{print substr($0,1,5)}'
12345

length 字符串长度

awk '{print length(123)}'
3

gsub 使得所有正则表达式被匹配的时候都发生替换

格式:gsub(regular expression,subsitution string,target string)

cat abc.txt
abc
abc

#替换abc.txt中的abc为def
awk '/abc/{gsub("abc","def",$0);print $0}' abc.txt
def
def

牛客shell练习

写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数

#!/bin/bash
line=`cat nowcoder.txt` | wc -l
echo $line

末尾查看

#!/bin/bash
tail -n 5 nowcoder.txt

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

#!/bin/bash
for i in $(seq 0 500)
do
	if [[ "((i % 7))" -eq 0 ]]; then
		echo $i
	fi
done
#===================================================
#或者
for i in {0..500..7}
do
	echo $i
done

输出第5行的内容

#!/bin/bash
#awk 'NR==5{print $0}' nowcoder.txt
awk '{if(NR==5)print $0}' nowcoder.txt

#或者
sed -n '5p' nowcoder.txt

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

#!/bin/bash
awk '/^$/{print NR}' nowcoder.txt

去掉文本中的空行

#!/bin/bash
awk '!/^$/{print $0}' nowcoder.txt

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

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


#还有${#i}得到长度
#还有管道给 | wc -m   获得长度

计算所有进程占用内存大小的和

内容为ps aux | grep -v ‘RSS TTY’ > nowcoder.txt

#!/bin/bash
awk '
	BEGIN{sum=0} 
	{sum+=$6} 
	END{print sum}
' nowcoder.txt

统计每个单词出现的个数

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

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

#!/bin/bash
cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){sum[$i]++}} END{for(key in sum){print sum[key]" "key}}' | sort \
|uniq -c | awk '{print $3" "$2}'

#sort 排序 特意将次数输出在第一位
#uniq  去除重复  虽然应该没有

输出第二列中有重复的次数

给定一个 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



#!/bin/bash
awk '{
		count[$2]++
	} 
	END{
		for(key in count)
			if(count[key] >= 2)
				print count[key]" "key
	}' nowcoder.txt


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

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


#!/bin/bash
awk '{for(i=1;i<=NF;i++) arr[i]=arr[i]" "$i} END{for(i=1;i<=NF;i++) print substr(arr[i],2)}' nowcoder.txt

#利用数组将每列的字符串组合,通过sbustr(字符串,起始位置,终止位置)内置函数来输出  2是因为开局的空格

#或者
awk '{print $1}' nowcoder.txt | xargs              #xargs横向输出和管道连用  -n指定个数
awk '{print $2}' nowcoder.txt | xargs

统计nowcoder.txt中每一行的1~5数字个数

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

#!/bin/bash
awk '
    BEGIN{
        Sum=0
    }
    {                                  #计算每行的数字个数
        LineSum=0
        len=length($0)
        #print len
        for(i=1;i<=len;i++)         #循环字符串字符数
        {
                if(substr($0,i,1)>=1 && substr($0,i,1) <= 5)   #substr截取比较
                {
                        LineSum++
                        Sum++
                }
        }
        print "line"NR" number:"LineSum
    }
    END {
                print "sum is "Sum
    }
    ' nowcoder.txt

去掉所有包含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
**

#!/bin/bash
while read line
do
	flag=0
	for i in $line
	do
		if [[ $i == "this" ]]; then
			flag=1
			break
		fi
	done
	if [[ $flag -eq 0 ]]; then
    	echo $line
    fi
done < nowcoder.txt


=====================================================
#或者
#!/bin/bash
awk '!/this/{print}' nowcoder.txt

求输入的数组的平均值

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

#!/bin/bash
Len=`head -n1 nonwcoder.txt` nowcoder.txt
Sum=`awk 'BEGIN{sum=0} NR!=1{sum+=$0} END{print sum}'` nowcoder.txt
echo "scale=3;$Sum/$Len" | bc

去掉输入中含有B和b的单词

示例:
假设输入如下:
big
nowcoder
Betty
basic
test

#!/bin/bash
grep -iv 'b' nowcoder.txt  #i不区分大小写  v取反

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值