次の行がありますが、「ABCD」を含むフィールドを見つけて、行の最後のフィールドの前に移動したいと思います。
string1;string2;xxxABCDxxx;string3;string4;string5;string6
出力
string1;string2;string3;string4;string5;xxxABCDxxx;string6
答え1
sed 's/\([^;]*ABCD[^;]*;\)\(.*;\)/\2\1/' <in >out
これはトリックを行う必要があります。
それだけに適用されます最初仕事が起こるABCD
しかし。行に複数がある場合、残りはすべてスキップされます。
最後のセミコロンを;
スラッシュに置き換えるには、わずかに変更するだけです。
sed 's|\([^;]*ABCD[^;]*\);\(.*;\)|\2\1/|' <in >out
答え2
sedに依存しない場合:
awk -v pattern="ABCD" '
BEGIN { FS = OFS = ";" }
{
# find the first field containing the string
for (i=1; i<NF; i++) if ($i ~ pattern) break
# alter the last field to the desired contents
$NF = $i "/" $NF
# shift each subsequent field one place
for (;i<NF; i++) $i = $(i+1)
# reset the number of fields
NF--
# and output the new line
print
}
' filename