ファイルから特定のスペースをコピーする

ファイルから特定のスペースをコピーする

次のファイルがあります

   18DMA      H 9996   0.886   5.687   5.320
   18DMA      H 9997   1.019   5.764   5.247
   18DMA     Np 9998   0.947   5.584   5.151
   18DMA      H 9999   1.033   5.541   5.113
   18DMA     Cn10000   0.880   5.674   5.050
   18DMA      H10001   0.831   5.616   4.971
   18DMA      H10002   0.814   5.751   5.091
   18DMA      H10003   0.957   5.735   5.003
   18DMA     Cn10004   0.837   5.486   5.185

必要な出力は3番目の列を削除することですが、特定の行/行から始まり、次の原子の名前と番号の間にスペースがないため、列ごとに削除することはできません。特定の数の文字を選択して削除する方法はありますか?予想される出力は次のようになります。

   18DMA      H    0.886   5.687   5.320
   18DMA      H    1.019   5.764   5.247
   18DMA     Np    0.947   5.584   5.151
   18DMA      H    1.033   5.541   5.113
   18DMA     Cn    0.880   5.674   5.050
   18DMA      H    0.831   5.616   4.971
   18DMA      H    0.814   5.751   5.091
   18DMA      H    0.957   5.735   5.003
   18DMA     Cn    0.837   5.486   5.185

答え1

cut文字モードで使用:

cut -c1-15,21-

正確な文字数を調整する必要があるかもしれません。繰り返しますが、これは入力がタブ(\t文字)を区切り文字として使用しないと仮定します(おそらくそうではありません。最初にフィールドをリンクするのに問題はありません)。

タブ文字がある場合、expandプログラムはそれを空白に変換できます。

答え2

sはありませんが、<TAB>フィールド区切り文字で複数のスペースがあると仮定し、私が見つけたサンプルデータを見て計算します。

  $ sed -E 's/^(.{15}).{5}/\1/' file
   18DMA      H   0.886   5.687   5.320
   18DMA      H   1.019   5.764   5.247
   18DMA     Np   0.947   5.584   5.151
   18DMA      H   1.033   5.541   5.113
   18DMA     Cn   0.880   5.674   5.050
   18DMA      H   0.831   5.616   4.971
   18DMA      H   0.814   5.751   5.091
   18DMA      H   0.957   5.735   5.003
   18DMA     Cn   0.837   5.486   5.185

\1 代替コマンドの交換部分でそれを使用して復元できるように、最初の15文字に「逆参照」を使用しますs

答え3

$ awk -v OFS='\t' 'NF == 5 { sub("[0-9]*$", "", $2) } NF == 6 { $0 = $1 OFS $2 OFS $4 OFS $5 OFS $6 } { print }' file
18DMA   H       0.886   5.687   5.320
18DMA   H       1.019   5.764   5.247
18DMA   Np      0.947   5.584   5.151
18DMA   H       1.033   5.541   5.113
18DMA   Cn      0.880   5.674   5.050
18DMA   H       0.831   5.616   4.971
18DMA   H       0.814   5.751   5.091
18DMA   H       0.957   5.735   5.003
18DMA   Cn      0.837   5.486   5.185

この短いawkプログラムは、入力行にスペースで区切られたフィールドが5つか6つ含まれているかによって異なる操作を実行します。

5つのフィールドが含まれている場合は、2番目のフィールドの末尾にあるすべての数字を削除し、残りは残ります。 6つのフィールドが含まれている場合、行は書き換えられますが、3番目のフィールドは省略されます。

出力はタブで区切られます(またはOFSコマンドラインで設定したとおり)。

答え4

私の場合は、最初に元のコンテンツを「編集」してからその列を削除します。ただし、両方を同時に実行できます。

awk '{sub(/[0-9]+/," &",$2); $0=$0; $3=""; print}' input_file

18DMA H  0.886 5.687 5.320
18DMA H  1.019 5.764 5.247
18DMA Np  0.947 5.584 5.151
18DMA H  1.033 5.541 5.113
18DMA Cn  0.880 5.674 5.050
18DMA H  0.831 5.616 4.971
18DMA H  0.814 5.751 5.091
18DMA H  0.957 5.735 5.003
18DMA Cn  0.837 5.486 5.185

この$0=$0割り当てにより、awk現在の行が再計算され、再分割されます。他のすべての答えとは異なり、これはフィールドの長さや数ではなく、2番目のフィールドの可能な形式のみを想定しています。

タブを出力フィールド区切り文字として使用するバージョン:

awk -vOFS='\t' '{sub(/[0-9]+/," &",$2); $0=$0; $3=""; sub(OFS OFS,OFS); print}' input_file

18DMA   H       0.886   5.687   5.320
18DMA   H       1.019   5.764   5.247
18DMA   Np      0.947   5.584   5.151
18DMA   H       1.033   5.541   5.113
18DMA   Cn      0.880   5.674   5.050
18DMA   H       0.831   5.616   4.971
18DMA   H       0.814   5.751   5.091
18DMA   H       0.957   5.735   5.003
18DMA   Cn      0.837   5.486   5.185

追加のコンテンツは、sub(OFS OFS, OFS)で作成した空のフィールドを縮小します$3=""。これは、タブで区切られたフィールドを特別に要求するツールでファイルを処理する場合、または審美的な理由でファイルを処理する場合にのみ必要です。

関連情報