0

以下のようなテキストファイルがあります。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
4

4 に答える 4

3
$ 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
于 2012-12-16T16:45:12.620 に答える
1

これはデータの形式に非常に固有ですが、機能します。

awk '{print substr($0,1,21)" "substr($0,22)}'
于 2012-12-16T04:27:00.110 に答える
0

私はそれをテストしていませんが、これはうまくいくはずです。

awk '{$5=substr($5,0,1)" "substr($5,1);print}' your_file
于 2012-12-16T13:18:51.510 に答える
0

5列目が1文字で始まると仮定すると、

{
  if(sub(/^./, "& ", $5)) {
    print $0;
  } 
} 
于 2012-12-16T04:29:22.213 に答える