将字段匹配模式移动到第一个字段

Move field matching pattern to first field

我有一个数百行的文件,例如:

猫蛙狗猪

狗猪鸟马

马蛙猪

我想将任何包含“PIG”的字段移动到第一个字段,如下所示:

猪猫蛙狗

猪狗鸟马

猪马蛙

是否可以在 awk one liner 中完成?我试图对我在另一个线程中发现的这一行进行逆向工程,该线程将匹配模式的字段移动到末尾,但我对 awk 的了解并不多:

awk '{ for(i=1; i<=NF; i++) if($i~/PIG/) a[i]++; } {for(i in a){str=str $i FS; $i=""} [=10=]=[=10=] FS str; =; str=""}1' file

非常感谢您的帮助。

awk '{
    out = 
    for (i=2; i<=NF; i++) {
        out = ($i ~ /PIG/ ? $i OFS out : out OFS $i)
    }
    print out
}'

下面的原始答案将从已发布的示例输入中产生已发布的预期输出,但在提供的示例输入未涵盖的某些 non-trivial 情况下会失败,因为循环中对 $0 的分配会重新拆分记录, 重新编号字段等可以跳过一个字段:

awk '{
    for (i=1; i<=NF; i++) {
        if ($i ~ /PIG/) {
            tmp = $i
            $i = ""
            [=11=] = tmp FS [=11=]
        }
    }
     = 
    print
}' file

这是一个 one-liner 解决方案:

echo
echo "${test1}"
echo

<<<"${test1}" mawk '(NF*=!_<NF) && \
                          sub("^",FS" ")+\
                      gsub("[ \t]+"," ")' FS='PIG' OFS=''

CAT FROG DOG PIG
DOG PIG BIRD HORSE
HORSE FROG PIG
FROG DOG HORSE

PIG CAT FROG DOG 
PIG DOG BIRD HORSE
PIG HORSE FROG