Cara menambahkan string ke file .txt di semua baris kecuali beberapa karakter menggunakan sed atau awk

8

Saya memiliki file teks bernama xid.txt:

xid: SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: SC32173 id: artf398402
xid: SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

Saya perlu menambahkan string 'PT_' sebelum 'SC48028', 'SC32173' ... seterusnya. String 'SC ...' dapat dimulai dengan kombinasi apa saja yang mungkin 'AC ...' atau 'DL ..'

Output yang dibutuhkan:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

Jika Anda melihat output di atas, kita tidak boleh memasukkan 'PT_' sebelum string yang dimulai dengan 'i', 'p', 'w' & 'numerik'. Saya telah mencoba beberapa perintah dasar untuk kebutuhan saya menggunakan insert / append in sed.

Subrat Sahoo
sumber
2
Pertanyaan Anda tentang topik dan selamat datang di sini, tetapi Anda mungkin tertarik pada situs Bioinformatika baru kami .
terdon

Jawaban:

13

Dengan awk :

awk '$2~/^[A-Z][A-Z]/{ $2="PT_"$2 }1' xid.txt

Hasil:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

  • $2~/^[A-Z][A-Z]/ - jika bidang ke-2 dimulai dengan 2 huruf besar

Atau pendekatan sed :

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt
RomanPerekhrest
sumber
ini sangat lancar, jawaban instan terima kasih banyak. Jika saya ingin menambahkan file input yang ada, apa yang harus dilakukan?
Subrat Sahoo
awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txtatau gunakan pendekatan kedua saya
RomanPerekhrest
1
@SubratSahoo Jika jawaban ini menyelesaikan masalah Anda, harap luangkan waktu dan terima dengan mengklik tanda centang di sebelah kiri. Itu akan menandai pertanyaan sebagai dijawab dan cara terima kasih diungkapkan di situs Stack Exchange.
terdon
1
Juga, @SubratSahoo (dan Roman) versi GNU yang lebih baru awk(yang biasanya Anda instal pada sistem Linux) memiliki -i inplaceyang memungkinkan Anda untuk mengedit file di tempat, seperti sed dan perl -i.
terdon
@terdon, ya, saya tahu tentang -i inplace(Saya telah menyarankan pendekatan terpadu dengan mvperintah untuk OP agar sesuai dengan portabilitas). Adapun Bioinformatics betakomunitas: Saya baru saja bergabung. Mungkinkah ada tugas yang berkaitan dengan pemrograman / pemrosesan Linux / Python? Bagaimana menurut Anda?
RomanPerekhrest
6

Opsi sed

sed -i -e 's/[A-Z][A-Z]/PT_&/' file

dimana

  • -i edit di tempat
  • -e perintah untuk dieksekusi
Archemar
sumber