次のファイルがあります
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=""
。これは、タブで区切られたフィールドを特別に要求するツールでファイルを処理する場合、または審美的な理由でファイルを処理する場合にのみ必要です。