这是我的输入文件 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时不能使用任何值作为参考。
答案 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