私たちはRedhat Linux 7.9とbsh
。
データファイルを見て、すべてのフィールドを列10と列20の間のスペースを0に置き換えたいと思います。
したがって、サンプルファイルがある場合:
#######################
#######################
#######################
######### ######
#######################
#######################
#######################
#######################
私はスクリプトが次のようになりたいです:
#######################
#######################
#######################
#########000000000#####
#######################
#######################
#######################
#######################
私は以下を試してみました。
awk '{val=substr($0,10,9);gsub(val," ","000000000")}1' scr1
ただし、元のファイルのみが返されます。私が逃したものは何ですか?
答え1
Perlは、示されているようにこれを簡単に処理できます。
Perlインデックスは0から始まるので、列10は9で、col10 ... 20には20-10 + 1 = 11要素があります。
$ perl -lpe 'substr($_, 9, 11) =~ tr/ /0/' file
出力:-
#######################
#######################
#######################
12345678901234567890
#########00000000000###
12345678901
#######################
#######################
答え2
パラメータのgsub()
順序と意味が正しくありません。マニュアルページをご覧ください。
すべてのUnixシステムのすべてのシェルでawkを使って次のことをしたいようです。
$ awk '{val=substr($0,10,9)} gsub(/ /,0,val){$0=substr($0,1,9) val substr($0,19)} 1' file
#######################
#######################
#######################
#########00000000######
#######################
#######################
#######################
#######################