在一行上从字符串打印 2 个不同的图案

All*_*obu 5 awk

我有一个包含如下字符串的文件。

F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315
Run Code Online (Sandbox Code Playgroud)

在这种情况下,字符串由“F”和数字标记。在这种情况下,标记物F1F2F3F4F5F6,和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)

Tim*_*edy 5

您非常接近可行的解决方案。这是一种方法(为了可读性而格式化):

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)