UNIX SHELL常用数据表的行和列特定输出处理

数据表处理过程常用的特定行列的删除或提取,在此利用shell unix语言进行处理进行学习分享

###按行提取数据sed使用

sed s 替换脚本命令

sed [选项] [脚本命令] 文件名 如[address]s/pattern/replacement/flags

sed通过特定的脚本指令对文件进行处理

a,append表示追加指令;i,insert表示插入指令;

d,delete表示删除指令;s,substitution表示替换指令

常用flags

n

1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 A,但用户只想替换第二个 A,这是就用到这个标记;

g

对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 A,则只会替换第一个 A

p

会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用

sed a i 插入脚本命令

a 命令表示在指定行的后面附加一行

i 命令表示在指定行的前面插入一行

sed [address]a\

sed '3a\This is an inserted line.' data

sed d 删除脚本命令

sed [address]d

sed '3d' 

cat data | sed -n '2~2p'  #提取偶数行

cat data | sed -n '1~2p'  #提取奇数行

cat data | sed -n '3~3p'  #提取3的倍数的行

cat data | sed -n '2p;5p'    #提取2和5行

cat data | sed -n '2, 5p'    #提取2到5行

cat data | sed -n '100,1p' #提取第100行

cat data | sed -n '/2/p'  #提取匹配2的行

cat data | sed -n '/2/!p'  #提取非匹配2的行 !

cat data | sed -n '3~3!p' #提取非3的倍数的行 !

cat data |sed -n '/2\|5/p'  #同时提取以2开头或者以5开头的行

cat data |sed -n '/^2/p'  #提取以2开头的行

cat data |sed -n '/^2\|^5/p'  #同时提取以2开头或者以5开头的行 |

cat data |sed -n '/2$\|5$/p'   #同时提取以2结尾或者以5结尾的行 |

cat data |sed -n '/^1.*5$/p'  #同时提取以1开头和5结尾的行

cat data | sed -i '1d'   #删除第一行

cat data | sed -i '2,10d'  #删除第2-10行

cat data | sed -i '$d' #删除最后一行

###按列提取数据使用awk/cut/paste等连用

awk 中,变量分为两种:内置变量与自定义变量。

常见的内置变量有:

FS:输入字段分隔符, 默认为空白字符

OFS:输出字段分隔符, 默认为空白字符

RS:输入记录分隔符(输入换行符), 指定输入时的换行符

ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符

NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

NR:行号,当前处理的文本行的行号。

FNR:各文件分别计数的行号

BEGIN和END,这两者都可用于pattern中

自定义变量用法:  awk v 变量名=变量值 [v 变量2=2 ] 'BEGIN{action}

#单引号{}里面为实施code {print}  action结束后用;作为结尾

awk ' BEGIN { FS=“:” ; } { print $1, $4 ; } '

测试一下:

cat data | awk ' END { print "Number of records in file is: ", NR } '   #统计行数

cat data | awk -F':' '{ print $1, $4 ;}'  #输出第一和第4列

 

#printf print ""连用; printf $i"\t"FS; print ""

awk '{for(i=2;i<=NF;i++) printf $i""FS; print ""}' filename  #从第2列到最后一列

awk '{for(i=2;i<=NF;i++) printf $i"\t"FS; print ""}' filename #以空格和tab键隔开,用printf \$i"t”即可

##awk已经无所不能 加上cut 和paste 基本可以实现数据的随意分割

测试数据:seq显示一组数据表(按列或按行)

seq 使用:seq [选项]... [首数] [增量] 尾数;只有一个数为尾数;两个数为首数和尾数 增量默认为1

-f:格式化数据,使用%g表示整数;如 -f "id:%06g" id:字符后跟6位整数

-s:分隔符;如 默认为 -s "\n" 换行;-s " "作为分隔符将不换行

-w: 数据宽度,不足补零,与-f不同时用

新技能部分:给变量赋值

#for i in $(echo "seq.fna" |awk -F ".fna" '{print $1}' )

选用$() 或` `获取变量值

# echo "seq.fna" | sed "s/"$i"/dna/g" 

for i in $(echo "seq.fna" |awk -F ".fna" '{print $1}' ); do echo "seq.fna" | sed "s/"$i"/dna/g"  ; done

for i in $(echo "seq.fna" |awk -F ".fna" '{print $1}' )

do

echo "seq.fna" | sed "s/"$i"/dna/g"  #变量在中间选用 "  "

done

测试:$i 或${i}均可以正常显示

for i in $(echo "seq.fna" |awk -F ".fna" '{print $1}' ); do echo "seq.fna" | sed "s/$i/dna/g"  ; done

单引号和双引号

sed命令中使用双引号的情况下,直接`shell command`或者$(shell command)引用命令执行

sed命令使用单引号的情况下,可以使用'"$var"'引用(单引号,然后双引号,变量)

理解:比如使用echo输出字符串时候,无论引号还是双引号都是一样的;

如果字符串中有变量,单引号会忽略,而双引号会把变量解析以后带入字符串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值