shell练习<2>

转置文件内容输出

题目描述

  • 写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容。
  • 为了简单起见,你可以假设:
    你可以假设每行列数相同,并且每个字段由空格分隔
示例:
假设 nowcoder.txt 内容如下:
job salary
c++ 13
java 14
php 12

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

题解1

  • awk中print与printf的主要差别:
  • print在显示多个结果的时候以逗号分隔,结果将这几部分的内容自动使用分隔符进行分隔,且不需要添加换行符\n
  • printf默认单行输出,换行需要加换行符\n,可以更加灵活的控制某一个字段的输出格式,通过使用诸如%-12s,%3.1f等格式化方法
#!/bin/bash
awk '{printf  $1" "}' nowcoder.txt    
awk '{printf $2" "}' nowcoder.txt

在这里插入图片描述

题解2

cat test4 | awk '{
    for (i=1; i<=NF; i++) {      %遍历文件每列
        if (NR==1) {             %第一行
            res[i]=$i;    %保存到数组,数组保存转置后的行
        }
        else {            %非第一行
            res[i]=res[i] " " $i    %修改数组值,追加当前字符
        }
    }
}
END {
    for (i=1; i<=NF; i++) {        %结束,遍历列,(行列数相同)
        print res[i]               %逐行打印
    }
}' 

在这里插入图片描述

去掉文件中含有特定单词的语句并将剩余输出

题目描述

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

题解

方法1:
grep -v 'this' test5        %反向匹配

方法2:
sed '/this/d' test5         %d:删除  “//”: 包含要搜索的字符串

方法3:
awk '$0!~/this/ {print $0}' test5     %检查当前$0(所有的列)不包含this随机输出  

在这里插入图片描述

去掉不需要的单词

题目描述

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


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

题解

grep -v -E 'b|B' test6

grep -v '[bB]' test6

grep -iv 'b' test6

sed '/b\|B/d' test6

sed '/[Bb]/d' test6

awk '!/[bB]/' test6

awk '$0!~/b|B/ {print $0}' test6

在这里插入图片描述

求平均值

题目描述

  • 写一个bash脚本以实现一个需求,求输入的一个的数组的平均值
1行为输入的数组长度N2~N行为数组的元素,如以下为:
数组长度为4,数组元素为1 2 9 8
示例:
4
1
2
9
8

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

题解

awk 'BEGIN{SUM=0;}{if(NR!=1){sum+=$1;}}END{printf("%.3f\n",sum/(NR-1))}'

awk '{if(NR!=1)a+=$1} END{printf("%.3f\n",a/(NR-1))}'

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值