解析字符串参考一系列数字 - shell脚本

时间:2016-05-09 23:12:33

标签: bash shell awk sed grep

这是我的输入文件 input.gz ,其中* NN * NNNNNNNNNN是完全随机的,未知。它的值为0到9。

yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]  
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA some random text
zzzzzzzzzzzz xxxxxxxx yy]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]
yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA]

在如下所示的第8行中,最后一列中的字符串被扩展到下一行。这只是一个例子。该字符串也可以扩展到其他行的下一行。

yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA some random text
zzzzzzzzzzzz xxxxxxxx yy]       

让我们举个例子:

yyyy-mm-dd hh:mm:ss string *18*6666666666 [AAAAA]  
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss string *18*6666666666 [AAAAA]
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss string *15*9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA some random text
zzzzzzzzzzzz xxxxxxxx yy]
yyyy-mm-dd hh:mm:ss string *13*7777777777 [AAAAA]
yyyy-mm-dd hh:mm:ss string *19*5555555555 [AAAAA]
yyyy-mm-dd hh:mm:ss string *10*4444444444 [AAAAA]

我将所有NNNNNNNNNN作为相同的数字以便更好地理解。

我需要一个使用SED或AWK或GREP的脚本,它只显示具有字符串AAAAA的uniq NNNNNNNNNN。最后一个coloumn也可能有其他一些字符串。但它必须在第一行或下一行有AAAAA。

请忽略所有其他限制,例如yyyy-mm-dd或hh:mm:ss。唯一需要考虑的限制因素是 * NN * NNNNNNNNNN AAAAA

预期输出应为:

*11*2222222222 
*10*4444444444  
*19*5555555555  
*18*6666666666  
*13*7777777777  
*15*9999999999

由于第8行的最后一列也扩展到下一行,我猜是否排除使用AWK? 如何正确实现这种方式的脚本? (如果这是错的,其他方式也可以)

grep "\[AAAA"|sed -n '/\*[0-9]*\*[0-9]*/p'  

请记住* NN * NNNNNNNNNN是完全随机的,所以我们在使用grep或sed时不能使用任何值作为参考。

3 个答案:

答案 0 :(得分:1)

X = 0:0.01:1; Y = 0:0.01:1; [x,y] = meshgrid(X,Y); z = sin(x.*y); contourf(x,y,z,[0.1,0.3,0.44,0.63,0.78,0.89],'ShowText','on') + sed解决方案:

sort -u

答案 1 :(得分:1)

使用GNU awk进行多字符RS,可能你想要的是什么:

$ awk -v RS='][[:blank:]]*\n' '/[^]]*AAAAA[^]]*$/ && !seen[$4]++{print $4}' file
*18*6666666666
*11*2222222222
*15*9999999999
*13*7777777777
*19*5555555555
*10*4444444444

如果没有,则编辑您的问题以提供更具真实代表性的样本输入和预期输出。例如,我想你可能想要处理:

$ cat file
yyyy-mm-dd hh:mm:ss string *10*2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss AAAAA *18*6666666666 [xxxxx]
yyyy-mm-dd hh:mm:ss string *11*3333333333 [some random text
AAAAA zzzzzzzzzzzz xxxxxxxx yy]
yyyy-mm-dd hh:mm:ss string *12*5555555555 [some
random
AAAAA text across
multiple
lines zzzzzzzzzzzz xxxxxxxx yy]
yyyy-mm-dd hh:mm:ss string *13*7777777777 [BBBBB]

为:

$ awk -v RS=']\n' '/[^]]*AAAAA[^]]*$/ && !seen[$4]++{print $4}' file
*10*2222222222
*18*6666666666
*11*3333333333
*12*5555555555

如果是这样,请尝试使用其他答案。

在你的问题As the last column in 8th row is extended to next line too, I guess using AWK is ruled out?中的陈述 - 完全相反。 grep和sed是基于行的,awk是唯一标准的UNIX工具,而不是基于记录的。

答案 2 :(得分:0)

你的意思是:

pattern="AAAAA"
zcat input.gz \
| grep '\['"$pattern"'[] ]' \
| sed -e 's/^.*\(\*[0-9*]*\).*$/\1/' \
| sort -u