使用BASH块文本文件

时间:2018-07-19 18:42:25

标签: bash grep zip tail unix-head

我对Bash不太熟悉,我想对zip文件中包含的txt进行分块。块必须从“ channel8”的​​5行到“ channel10”的2行

12082008;pull done;ret=34;Y
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel8
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel9
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel10
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel11
01062008;psuh done;ret=23;Y

到目前为止,我只能成功分配到第10频道,请参见下文:

12082008;pull done;ret=34;Y
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel8
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel9
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel10
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N

但是我不知道如何使用bash输出从第8频道中进行选择。

这是我的代码

for file in ./*.zip; do head -$(($(unzip -c $file | grep -n $channel_after | cut -f1,1 -d":")-1)) <(unzip -c $file);done

2 个答案:

答案 0 :(得分:1)

a = rep(a,1000) microbenchmark::microbenchmark( a=grepl("^((?!and).)*Cord((?!and).)",a,ignore.case = T,perl=T), b=grepl("^(?:(?!and).)*Cord(?:(?!and).)",a,ignore.case = T,perl=T) ) Unit: milliseconds expr min lq mean median uq max neval cld a 8.604448 8.631186 8.693752 8.656785 8.716235 9.077194 100 b b 7.915523 7.944821 7.999503 7.967861 7.998580 9.221692 100 a 会做这项工作吗?

sed

unzip -c $file | sed -n '/Channel8/,/Channel10/p' 命令将打印sedChannel8之间的所有内容,包括Channel10行。

如果您不希望包含Channel行,则可以使用另一个Channel删除而不是打印。

sed

答案 1 :(得分:-1)

听起来您需要的是

unzip -c "$file" |
    awk '
        /^Channel8$/ { seenBeg = 1 }

        seenBeg {
            if ( seenEnd && /^Channel/ ) {
                exit
            }
            else if ( /^Channel10$/ {
                seenEnd = 1
            }
            print
        }
    '