2020-04-16 awk, sed, rename学习随笔,
2020-04-16 本文已影响0人
xiaoguolaile
awk标准语法
awk -F "(分隔符)" ‘BEGIN{}{}END{}’ FILENAME
awk打印第一次匹配行后的行
awk -v line1=$(awk '/X/{print NR;exit;}' $i) 'NR>=line1{print $0}' $i
-v 定义变量line1;
$i 要操作的文件;
$(awk '/X/{print NR;exit;}' $i) 匹配$i文件中包含X的行,打印行号NR并退出(获得第一次匹配X的行号);
'NR>=line1{print $0}' 打印行号大于line1的行;
awk 打印匹配内容之前或之后的指定行
awk -v line=$(awk '/dd/{print NR}' $i) '{if(NR==line+2){print $0}}' $i
$i 要操作的文件
dd 匹配的内容
打印匹配dd后的第二行NR==line+2
awk -v line=$(awk '/dd/{print NR}' $i ) '{if(NR==line-2){print $0}}' $i
$i 要操作的文件
dd 匹配的内容
打印匹配dd前的第二行NR==line-2
awk只处理第一个匹配的行,匹配后使用exit命令退出处理
awk '/dd/{i++;if(i<3){print $0}else{exit;}}' $i
处理3个匹配dd行后结束处理
awk 处理指定行
awk 'NR==1,NR==5{print $0}' file
按照行数切割文件
awk -v count=$line_number 'BEGIN{i=0} {print $0 > sprintf("%s_%d",FILENAME,i) ; if (NR>=(i+1)*count){close(sprintf("%s_%d",FILENAME,i)); i++;} }' $filename
-v 定义变量count;
$line_number为你要按照多少行为一个文件来切割原始文件$filename;
实际使用时,将$line_number及$filename替换为你自己的数据就行
注释:
-v count=$line_number #传递参数,按照$line_number行分割,实际使用时替换为你自己的数字
‘BEGIN{}{}’ #主体结构
BEGIN{i=0} #定义一个初始值,这里i来定义文件名,编号从第0个文件开始
{print $0 > sprintf("%s_%d",FILENAME,i) ;#将整行输出到(>)FILENAME(文件句柄,代表最后你的执行文件名)
# sprint 打印格式化输出
# %s_%d" 输出格式:%s字符串(第一变量)%d 整数(第二变量)
if (NR>=(i+1)*count){close(sprintf("%s_%d",FILENAME,i)); #当每超过(i+1)*count行时,关闭对应的文件句柄,到这里一个包含(i+1)*count行的文件就结束了
i++;#进行下一个分割文件
$filename #被分割的文件,替换为你自己的即可
按照第一列内容切割文件
awk '{if(NR==1){name=$1}if(name != $1){name=$1} print $1"\t"$2"\t"($4+$5)"\t"$6 >>name".txt"}' file.txt
for i in $(cat ../samples);do awk '{if(NR==1){name=$1}if(name != $1){name=$1} print $1"\t"$2"\t"($4+$5)"\t"$6 >>"'"$i."'"name".txt"}' $i.txt
首先将第一行第一列赋值给name,
如果第一列$1值是name,name打印需要的内容到name.txt
如果第一列$1值不是name,name对name重新赋值,然后打印到新文件
如第二条命令,假如包含循环,这个循环会产生变量$i,那么这个$i如何传递到awk中呢,这里就需要"'"$i"'"(两边是两个双引号中间再夹一个单引号)
sed命令
sed -i 命令在文件第一行添加内容和删除第一行
sed -i '1i\要添加的内容' yourfile ##在第一行插入内容
sed -i '1d' yourfile ##删除第1行
sed -i '1,2d' yourfile ##删除第1,2行
sed 语法
sed:
p 打印匹配行
= 打印匹配行号
-n 打印模式匹配的行
-e 命令行进行编辑
sed打印所有匹配行行号 sed -n '/aa/=' yourfile
sed打印匹配内容 sed -n '/aa/p' yourfile
sed打印匹配内容和匹配行号 sed -n -e '/aa/=' -e '/aa/p' yourfile
sed打印最后一个匹配内容的一行 sed -n -e '/aa/=' -e '/aa/p' aa | tail -n1
sed后边插入变量
如果要插入的是个变量,则需要将注意两点:
使用双引号来替代单引号
使用反斜杠对\进行转译
sed -i "s/pattern/ a\\$var/" yourfile
一定要有两个反斜杠\\
ls *_sub2.txt|while read dd;do sed -i "1i\\$dd" $dd;done ##批量将文件名写入文件的第一行
在行首和行尾添加字符
在行首添加字符chr
sed -i 's/^/chr&/g' yourfile
在行尾添加字符tail
sed -i 's/$/&tail/g' yourfile
同时在行首和行尾添加字符
sed -i '/./{s/^/chr&/;s/$/&tail/}' yourfile
## -i 在源文件上直接修改
## s/// 替换模式
## ^ 行首定位符 $ 行尾定位符
## g 全局替换global
##
rename用法
在centos 和ubuntu中用法不同
在centos中:rename "要被替换的文本" "被替换的文本" 被修改的文件 ###总共三个参数
在ubuntu中:rename 's///' file ##用正则表达式