次のサンプル.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
上記のコマンドはX
That'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