Shell 处理数据用到的一些小代码
这篇文章记录一些在用 Shell 简单处理一些数据时用到的一些小代码,主要是个人在科研中遇到的,简单记录下,备忘,随时更新。
 本文最后更新于 2018-12-07【2517 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!
这篇文章记录一些在用 Shell 简单处理一些数据时用到的一些小代码,主要是个人在科研中遇到的,简单记录下,备忘,随时更新。
主要用到的命令大概也是 ls 、 echo 、find、 bc 、grep 、sed 和 awk了
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  文章目录   
 本文作者:Quanyin Tang
本文链接:Shell 处理数据用到的一些小代码 - https://www.imtqy.com/shell-data-codes.html
版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
 
微信


sed 's/ori/sub/g' example-file.txt
这个很实用啊
是的,配合循环,批量创建任务无敌了