本文最后更新于 2018-12-07【286 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!

这篇文章记录一些在用 Shell 简单处理一些数据时用到的一些小代码,主要是个人在科研中遇到的,简单记录下,备忘,随时更新。

主要用到的命令大概也是 lsechofindbcgrepsedawk

echo

有时为了输出结果更明了,需要使用 echo 进行提示,但是又不想换行,就需要使用参数 \c

# 默认换行
echo "输入参数:"
echo "输出变量:$para"
# 不换行,-e 表示开启转义, /c 表示不换行
echo -e "输入参数:\c"
# 不换行,用参数 -n
echo -n "输出结果"

生成序列

两种方式,利用 {..} 和 命令 seq

# 生成 First 到 Last 间隔 Increment 的序列
{First..Last..Increment}
seq FIRST INCREMENT LAST

{..} 方法的好处是简单快捷,但好像不支持其中的参数为变量?
seq 方法更具有普适性,速度上可能会有损失

ls

只显示目录

有时在用 for 循环时,只想对当前目录下的目录进行操作,就需要 ls 只显示目录而不显示文件了

ls -d */

find

寻找最底层的目录

find -type d -printf "%n %p \n"|grep "^2 "|awk '{printf $2 "\n"}
此命令来源于网络,第一次见时,惊叹于强大的功能与逻辑

浮点运算 bc

Bash Shell 默认只支持整数运算,如果需要浮点运算就需要 bc 来帮忙了,脚本中的使用方式是:

e=$(echo "scale=5; $a / $b" | bc)
尽量加 scale 指定运算位数

grep

这个命令比较熟悉,常用的参数也就是

  • -i:忽略大小写
  • -n:输出结果的行数
  • -v:反向匹配查找
  • -A 数字:输出匹配结果及其后面的几行(After)
  • -B 数字:输出匹配结果及其前面的几行(Before)

sed

在源文件中修改

sed 默认的输出方式是原文件不变,将修改后的结果输出到屏幕

# 输出到屏幕,原文件不做修改
sed  '处理命令' 要处理的文件
# 不输出到屏幕,在原文件上直接修改
sed -i '处理命令' 要处理的文件

替换

# 将所有的 ori 替换成 sub
sed 's/ori/sub/g' example-file.txt

删除

# 删除 del
sed '/del/d' example-file.txt

更换命令分割符

sed 中的分隔符是任意指定的,默认是 /,但可以任意指定,可以是 %$等:

# 替换为 $
sed '$del$d' 
# 替换为 %
sed '%del%d'

awk

awk 是强大的文本处理工具,按行处理文本。

特殊变量

awk 默认有几个特殊变量,在编程时使用起来会方便很多

  • $N:表示第 N 列数据
  • NR:当前读出的行数
  • NF:当前记录中的字段个数
  • FS:输入字段分隔符(默认值为空格)
  • OFS:输出字段分隔符(默认值为空格
  • RS:输入记录分隔符(默认值为换行符)
  • ORS:输出记录分隔符(默认值为换行符)

print 结果换行

只输出第一列数据
awk '{print $1 "\n" }' data.txt

求和

awk '{sum+=$1} END {print "Sum = ", sum}' data.txt

输出平均值

awk '{sum+=$1} END {print "Average = ", sum/NR}'  data.txt

输出最大值

awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'  data.txt

输出最小值

awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'  data.txt
文章目录

推荐使用:阿里云 云翼计划学生优惠、ECS、轻量应用等产品与服务【 点击注册

本文作者:Quanyin Tang

本文链接:Shell 处理数据用到的一些小代码 - https://www.imtqy.com/shell-data-codes.html

版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!