以下のようなテキストファイルがあります。5列目の文字と数字の間にスペースを入れたいと思います。awkでこれを行うにはどうすればよいですか?
cxe 911 bv heg A1029 53.030
bvf 912 cv lya A1030 51.99
Desired output
cxe 911 bv heg A 1029 53.030
bvf 912 cv lya A 1030 51.99
以下のようなテキストファイルがあります。5列目の文字と数字の間にスペースを入れたいと思います。awkでこれを行うにはどうすればよいですか?
cxe 911 bv heg A1029 53.030
bvf 912 cv lya A1030 51.99
Desired output
cxe 911 bv heg A 1029 53.030
bvf 912 cv lya A 1030 51.99
$ awk 'match($0,/([^[:space:]]+[[:space:]]+){4}[^[:space:]]/) {
print substr($0,1,RLENGTH), substr($0,RLENGTH+1) }' file
cxe 911 bv heg A 1029 53.030
bvf 912 cv lya A 1030 51.99
上記の「4」は、関心のある列、つまり 5 番目の前の列の数です。別のフィールドで操作したい場合は、その数値を明白な方法で変更するだけです。
古いバージョンの gawk を使用している場合は、 --re-interval フラグを追加する必要がありますが、新しい gawk ではデフォルトで RE-intervals ({4}) が有効になっています。
また、必要に応じて、より簡潔ですが GNU-awk 固有のソリューションを次に示します。
$ awk '{print gensub(/(([^[:space:]]+[[:space:]]+){4}[^[:space:]])(.*)/,"\\1 \\3","")}' file
cxe 911 bv heg A 1029 53.030
bvf 912 cv lya A 1030 51.99
sub() のペアを使用して任意の awk で同様のことができますが、それは醜いので、それらの awk には match()/substr() を使用します。
最後に、他の人が投稿したように、各行の 5 番目のフィールドの最初の文字の後ではなく、各行の 21 番目の文字の後にスペースを追加するソリューションが必要な場合は、次のようになります。
$ awk 'sub(/.{21}/,"& ")' file
cxe 911 bv heg A 1029 53.030
bvf 912 cv lya A 1030 51.99
これはデータの形式に非常に固有ですが、機能します。
awk '{print substr($0,1,21)" "substr($0,22)}'
私はそれをテストしていませんが、これはうまくいくはずです。
awk '{$5=substr($5,0,1)" "substr($5,1);print}' your_file
5列目が1文字で始まると仮定すると、
{
if(sub(/^./, "& ", $5)) {
print $0;
}
}