我有一个包含如下字符串的文件。
F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315
Run Code Online (Sandbox Code Playgroud)
在这种情况下,字符串由“F”和数字标记。在这种情况下,标记物F1
,F2
,F3
,F4
,F5
,F6
,和F7
。
我想打印后面的 5 个字符F2
和后面的 6 个字符F6
,以空格分隔,以便结果是
B3094 BC313D
Run Code Online (Sandbox Code Playgroud)
这是我的尝试,虽然它打印成两行而不是一行。如何将两个值放在一行上。
$ echo F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315 | \
awk '{match($0,/F2/); print substr($0, RSTART +2, RLENGTH +3);} \
{match($0,/F6/); print substr($0, RSTART +2,RLENGTH +4);}'
Run Code Online (Sandbox Code Playgroud)
您非常接近可行的解决方案。这是一种方法(为了可读性而格式化):
awk '{
match($0,/F2/);
a=substr($0, RSTART +2, RLENGTH +3);
match($0,/F6/);
b=substr($0, RSTART +2,RLENGTH +4);
print a" "b
}'
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将您的两个substr()
函数分配给变量,而不是直接打印它们,然后在最后将它们设置为同时打印。通过在单个打印调用中打印它们,awk
只在行尾添加一个换行符,而不是在行的每个部分之后添加一个换行符,这就是将结果分成两行的原因。
bash:~$ echo F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315 | awk '{match($0,/F2/); a=substr($0, RSTART +2, RLENGTH +3); match($0,/F6/); b=substr($0, RSTART +2,RLENGTH +4); print a" "b}'
B3094 BC313D
Run Code Online (Sandbox Code Playgroud)