数据表处理过程常用的特定行列的删除或提取,在此利用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输出字符串时候,无论引号还是双引号都是一样的;
如果字符串中有变量,单引号会忽略,而双引号会把变量解析以后带入字符串。