特定の行と列の文字を置き換える

特定の行と列の文字を置き換える

次のサンプル.txtを考えてみましょう。

ATO   N   X B               
AT    H1  X BT              
ATOM H25  X BAA              
ATOM  H3  X BUTZ              
ATOM  CA  X BAT 

2-4行のXをawkなどの「A」に置き換えたいので、出力は次のようになります。

ATO   N   X B               
AT    H1  A BT              
ATOM H25  A BAA              
ATOM  H3  A BUTZ              
ATOM  CA  X BAT 

ファイル内のその場所を強調表示します。

どうすればいいですか?ありがとう

答え1

そしてawk

awk 'BEGIN{ OFS=FS="" } FNR>=2 && FNR<=4 && $11=="X"{ $11="A" }1' sample.txt

空の文字列を入力フィールドと出力フィールドの区切り文字として使用し、11番目のフィールドが含まれている場合は入力ファイルの定義レコード番号に置き換えますX。その後、記録を印刷します。

答え2

簡単なsedコマンドでタスクを実行します。

sed '2,4s/ X / A /' your_file


cat foo.txt
ATO   N   X B               
AT    H1  X BT              
ATOM H25  X BAA              
ATOM  H3  X BUTZ              
ATOM  CA  X BAT 

sed '2,4s/ X / A /' foo.txt

ATO   N   X B               
AT    H1  A BT              
ATOM H25  A BAA              
ATOM  H3  A BUTZ              
ATOM  CA  X BAT 

@Quasimodoが指摘したように、sed上記のコマンドはXThat's a GNU Awkソリューションのような他のシーケンスが発生すると失敗します。

awk 'NR >= 2 && NR <= 4 && $3~/X/ { sub(/X/, "A") } { print }' foo.txt

修正する

このコマンドを提供した@Quasimodoに感謝します。

sed '2,4s/^\(.\{10\}\)X/\1A/'

これにより、11番目の文字でXのみが置き換えられます。

答え3

使用アッ、図に示すように、必ずしもGNUである必要はありません。まず、範囲に基づいて行を選択してから、11番目の文字位置で置き換えてさらに具体化します。

awk '(NR==2),(NR==4) {
    sub(/^.{10}X/, substr($0,1,10) "A")
}1' file

同じもの真珠

perl -lpe 'substr($_,10,1) =~ s/X/A/ if 2..4' file

sed -e '
  2,4s/./&\n/11
  s/X\n/A/;s/\n//
' file

入力する:

cat - <<\! > file
ATO   N   X B               
AT    H1  Q BT              
ATOM H25  X BA
ATOM  H3  X
ATOM  CA  X BAT 
!

結果:

ATO   N   X B               
AT    H1  Q BT              
ATOM H25  A BA
ATOM  H3  A
ATOM  CA  X BAT 

答え4

awk 'NR >1 && NR <5 {gsub("X","A",$3)}1' filename

出力

ATO   N   X B               
AT    H1  A BT              
ATOM H25  A BAA              
ATOM  H3  A BUTZ              
ATOM  CA  X BAT

関連情報