我对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
答案 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'
命令将打印sed
和Channel8
之间的所有内容,包括Channel10
行。
如果您不希望包含Channel
行,则可以使用另一个Channel
删除而不是打印。
sed
答案 1 :(得分:-1)
听起来您需要的是
unzip -c "$file" |
awk '
/^Channel8$/ { seenBeg = 1 }
seenBeg {
if ( seenEnd && /^Channel/ ) {
exit
}
else if ( /^Channel10$/ {
seenEnd = 1
}
print
}
'