次のステートメントを含むファイルがあります。
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(255)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(255)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(255)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(255)
etc
私はそれを次のように変更したいと思います:
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)
etc
とにかく、追加の質問は、属性名が「in $」で終わる項目だけを変更したいということです。ここで $ は数値です (例: myName_in_3 VARCHAR(255))。
偶然にも '_in' (インディケータ属性) がペアで出てくるので、n~2 (または FNR%2==0) を実行するのはかなり賢い方法ですが、 '_in$VARCHAR(' を識別する方が良いかどうか疑問に思います。 ?255 )'を変化のモデルにしている。
わかりやすいコードを使用してこれをどのように実行しますか?ファイルが大きくないため、パフォーマンスは大きな問題にはなりません。
答え1
first~step
GNU sedを使用すると、2行目から始まる他のすべての行が変更されるようにフォーマットで行アドレスを指定できます2~2
。
$ sed '2~2 s/(255)/(1)/' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)
答え2
そしてawk
:
$ awk 'FNR%2==0{sub(255,1)}1' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)
説明する
FNR%2==0
偶数行だけが一致します。- 行が偶数の場合
255
はに1
置き換えますsub(255,1)
。 1
awk
印刷のための実際の条件です$0
。
次のような他のツールにも同じロジックを使用できますperl
。
perl -pe 's/255/1/ unless $. % 2' file
を使用すると、sed
次のことができます。
sed -e 'n;s/255/1/' file
修正する
お客様の更新リクエストに応じて、ソリューションを若干変更することがあります。
そしてawk
:
awk '/_in_[0-9]/{sub(255,1)}1' file
そしてsed
:
sed -e '/_in_[0-9]/{s/255/1/}' file
そしてperl
:
perl -pe 's/255/1/ if /_in_[0-9]/' file
答え3
持つ
sed '/_in_/ s/255/1/'
つまり、一致する行を検索してに/_in_/
置き換え255
ます1
。
答え4
cat oldfile.txt |awk '/_in_[0-9]/{sub(255,1)}1' > newfile.txt