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                ##用正则表达式 
上一篇下一篇

猜你喜欢

热点阅读