将字段匹配模式移动到第一个字段
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
我有一个数百行的文件,例如:
猫蛙狗猪
狗猪鸟马
马蛙猪
我想将任何包含“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