美文网首页
2020-04-16 awk, sed, rename学习随笔,

2020-04-16 awk, sed, rename学习随笔,

作者: xiaoguolaile | 来源:发表于2020-04-16 17:45 被阅读0次

    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                ##用正则表达式 
    

    相关文章

      网友评论

          本文标题:2020-04-16 awk, sed, rename学习随笔,

          本文链接:https://www.haomeiwen.com/subject/iredvhtx.html