Shell 处理数据用到的一些小代码
这篇文章记录一些在用 Shell 简单处理一些数据时用到的一些小代码,主要是个人在科研中遇到的,简单记录下,备忘,随时更新。
本文最后更新于 2018-12-07【2336 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!
这篇文章记录一些在用 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
这个很实用啊
是的,配合循环,批量创建任务无敌了