• linux命令(39):shell 打印偶数行,奇数行 ,行号


    awk 命令:

    1、

    打印行号和内容:

    awk '{print NR":"$0}'

    2、

    输出:偶数行和奇数行到文件

    awk '{print $0.txt > NR%2.txt}'  file

    3、

    打印出奇数行内容:(三者等价)

    awk 'NR%2==1' file  

    awk 'NR%2' all_file.txt

    awk 'i=!i' file

    打印出偶数行的内容:(三者等价)

    awk 'NR%2==0' file

    awk '!(NR%2)' file

    awk '!(i=!i)' file

    sed 命令:

    打印出奇数行:

    sed -n '1~2p'  file

    打印出偶数行:

    sed -n '2~2p' file

    扩展内容:

    一. 行距:

    1. 每行间加一个空行

    awk '1; { print "" }'   filname.ext             #输出当前行,在输出一个空行

    awk '1 { print } { print "" }'   filname.ext

    awk '{ print } { print "" }'   filname.ext

    2. 1的另外一种实现方法:

    awk 'BEGIN { ORS=" " }; 1'   filname.ext    #预先设置每一行的分隔符号为两个换行;你可以尝试把ORS设置为其他的看看效果如何

    3. 仅输出非空行,并每行间在加一个空行

    awk 'NF { print $0 " " }'   filname.ext       #NF表示当前行的字段数,$0表示当前行,最后再加一个换行

    4. 双倍行距;没行间两个空行

    awk '1; { print " " }'   filname.ext     #默认输出后会换行的,输出 ,则会输出两个空白行

    等同于:

    awk '{ print; print " " }'   filname.ext

    5. 显示当前行在所在文件中的行号

    awk '{ print FNR " " $0 }'   filname.ext      #FNR,表示当前行在文件中的行号

    6. 显示当前行在本次处理过程中的行号

    awk '{ print NR " " $0 }'   filname.ext       #NR,表示当前行在本次处理过程中的行号

    小疑问:为啥有FNR和NR的差别呢?效果不都是一样么? 如果你给如:filname1.ext filname2.ext,你就会看到差别了。原来:FNR,是每个文件中的,换了一个文件,会归零;而NR则每个文件会累加起来的

    7. 使用简单样式来输出

    awk '{ printf("] : %s ", NR, $0) }'   filname.ext    #行号占用5位,不足补空格

    8. 显示非空行

    awk 'NF { $0=++a " :" $0 }; { print }'   filname.ext

    #NF前面说了,表示当前行的行号,此处用他作为条件,如果是空行,则NF为0,跳过;否则,用动态变量a存储非空行的数目

    9. 计算行数:效果类似wc -l

    awk 'END { print NR }'   filname.ext    #END表示每行都处理完了后,在执行,此时NR就是最后一行的行号,也就是总的行数了。

    10. 计算每一行的和

    awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }'   filname.ext

    #s用作每行和的累加,从1到NF(每行总的字段数),依次累加

    11. 计算文件中所有字段的和

    awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }'   filname.ext

    #s用作总和的累加,每行都处理完成了,再输出s;注意和10对比,此处没有每行清零,所以累加了。没有设置的变量,默认为空,但是会根据上下文数值计算情况自动变为0

    12. 将每个字段用其绝对值代替

    awk '{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }'  filname.ext

    #$i表示当前行中的字段,$0表示当前行,可以改变$i的值

    13. 计算文件中总的字段和(例如计算单词数)

    awk '{ total = total + NF }; END { print total }'  filname.ext

    14. 计算匹配指定信息的总行数

    awk '/Linux/ { n++ }; END { print n+0 }'  filname.ext

    15. 找到文件中每行第一个字段中,最大的数,以及其所在的行

    awk '$1 > max { max=$1; maxline=$0 }; END { print max, maxline }'  filname.ext

    #用max存储最大的数,maxline存储最大数所在的行,并在最后输出

    16. 显示当前行的字段数,并输出当前行

    awk '{ print NF ":" $0 } '  filname.ext

    17. 显示每行最后一个字段的内容

    awk '{ print $NF }'  filname.ext   #NF表示当前行的字段数,例如为3,则$NF,就是$3,也就是第三个字段了

    18. 显示最后一行的最后一个字段

    awk '{ field = $NF }; END { print field }'  filname.ext

    #每行处理没有输出,尽在最后输出,field作为每行的最后一行的暂存变量

    19. 显示字段数小于4的行

    awk 'NF < 4'  filname.ext   #{}以外的内容,作为条件,没有{},则默认输出当前行

    20. 显示每行的最后一个字段小于4的行

    awk '$NF < 4'  filname.ext   #注意和19对比

  • 相关阅读:
    冒泡排序
    pdo 单例类
    php 事物处理
    支付宝支付
    反向代理和负载均衡
    execl导出
    网络层
    OSI 7层 TCP/IP 4层 综合5层
    面试总结
    CMD AMD
  • 原文地址:https://www.cnblogs.com/lovychen/p/6709197.html
Copyright © 2020-2023  润新知