zoukankan      html  css  js  c++  java
  • shell awk学习3

    需求:

    某文件aa的内容如下:

    a
    /p1
    /p2
    b
    /pp1
    c
    /ppp1
    /ppp3
    d
    /p1
    /p2
    /p3
    e
    /p1
    /p2
    /p3
    /p4

    期望输出结果:

    a /p1 /p2
    b /pp1
    c /ppp1 /ppp3
    d /p1 /p2 /p3
    e /p1 /p2 /p3 /p4

    思路

    第一个非“/” 开始的行到第二非“/”开始的行之间的内容输出到一行,第二个和第三个以非“/”开始的行之间的内容,其中前一个是闭区间,后一个是开区间,

    比如:获取的非“/” 开始的行号为

    1 3 5 7

    那么输出 对应文件的一下行的内容:

    1 2

    3 4

    5 7

    注意:倒数第二个的时候是闭区间,即7不用减1。

    脚本

    awk '{if($1 !~/^//){print NR}}' aa >row1
    cat aa | wc -l >> row1
    a=($(cat row1))
    
    len=${#a[@]}
    for ((i=0;i<=$len-2;i++))
    do
    if [[ ${a[${#a[*]}-2]} -eq ${a[i]} ]];then
            echo ${a[i]}"|"${a[i+1]} >> b
    else
          let "tmp = ${a[i+1]}-1"
            echo ${a[i]}"|"$tmp >> b
    fi
    done
    
    for i in `cat b`
    do
        begin=$(echo $i | awk -F'|' '{print $1}')
        end=$(echo $i | awk -F'|' '{print $2}')
        awk 'NR>='$begin' && NR<='$end'{printf $0" "}' aa
        echo
    done
    
    rm -rf b

    脚本解释:

    awk '{if($1 !~/^//){print NR}}' aa >row1 // 获取所有非“/”开始的行号
    cat aa | wc -l >> row1  // 插入aa文件的总行数,定位最后一个区间的结束,后面会用到这个。

    a=($(cat row1)) 转换为数组

    红色字体的代码块实现思路中描述的。

    最后一个for循环输出期望的结果。

    测试结果:
    [redis@lxd-vm1 ~]$ sh a4.sh
    a /p1 /p2 
    b /pp1 
    c /ppp1 /ppp3 
    d /p1 /p2 /p3 
    e /p1 /p2 /p3 /p4 
    [redis@lxd-vm1 ~]$ 
  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/imdba/p/10311391.html
Copyright © 2011-2022 走看看