1

我正在通过一个非常复杂且冗长的多条件语句来执行此操作,并且想知道是否有人知道更简单的方法。我有一个要解析的多列/多行列表。我需要做的是取第一行在第 5 个位置有“ * ”并将所有这些条目复制到接下来几行的空白处,然后丢弃原始的顶行。使这有点复杂的是,有时接下来的几行可能在所有其他字段中都没有空白空间(参见原始列表的下半部分)。如果是这种情况,我想获取额外的条目(下面的 Q1)并将其放在行尾的新列中。

原名单:

A B C D ***** F G
    E1
    E2
    E3
Q R S T ***** V W
    U1
Q1  U2

最终输出:

A B C D E1 F G
A B C D E2 F G
A B C D E3 F G
Q R S T U1 V W
Q R S T U2 V W Q1

提前感谢您的帮助!

4

1 回答 1

1

简洁/神秘的一班:

awk '/[*]/{f=$0;p="[*]+";next}{r=$2?$2:$1;sub(p,r,f);p=r;print $2?f" "$1:f}' file
A B C D E1 F G
A B C D E2 F G
A B C D E3 F G
Q R S T U1 V W
Q R S T U2 V W Q1

解释:

/[*]+/ {                  # If line matches line with pattern to replace
    line = $0             # Store line
    pat="[*]+"            # Store pattern
    next                  # Skip to next line
}
{
    if (NF==2)            # If the current line has 2 fields 
       replace = $2       # We want to replace with the second
    else                  # Else
       replace = $1       # We want to replace with first first

    sub(pat,replace,line) # Do the substitution
    pat=replace           # Next time the pattern to replace will have changed 

    if (NF==2)            # If the current line has 2 fields
       print line,$1      # Print the line with the replacement and the 1st field
    else                  # Else
       print line         # Just print the line with the replacement 
}

要运行脚本,请将其保存到文件中,例如script.awk运行awk -f script.awk file.

于 2013-04-22T19:46:21.473 回答