Ganti semua nilai dalam satu kolom ke 1


8

Saya memiliki beberapa file teks yang berisi 12 baris dan 3 kolom.

Contoh:

2       6    0.74  
42      6    0.58  
80      6    0  
112     6    0.24  
132     6    1  
216     6    0.7  
342     6    0  
390     6    0.21  
432     6    0.56  
466     6    0.75  
524     6    0.6  
646     6    0.9 

Saya ingin mengatur semua nilai kolom ketiga ke 1 di semua baris.

Outputnya akan terlihat seperti ini:

2    6   1  
42   6   1  
80   6   1  
112  6   1  
132  6   1  
216  6   1  
342  6   1  
390  6   1  
432  6   1  
466  6   1  
524  6   1  
646  6   1  

Adakah yang tahu perintah yang bisa menyelesaikan masalah ini?

Jawaban:


16
awk '{print $1, $2, "1"}' inputfile

1
Perintah ini mencetak baris pertama dalam file teks dengan benar di terminal, tetapi tidak membuat perubahan dalam file ...
user203269

redirect output ke file lainawk '{print $1, $2, "1"}' inputfile > newfile
user1700494

Terima kasih! Ini berfungsi tetapi hanya menulis baris pertama, kolom 1, 2 dan 3. Saya ingin menulis semua 12 baris dengan cara yang sama :)
user203269

12

mencoba

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 akan mengatur bidang ketiga ke 1

sed (di sini GNU atau busybox seddengan -iopsi untuk mengedit di tempat)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$adalah urutan dari 0ke 9dan .hingga akhir baris.

sed (golfed 4 byte)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ karakter apa pun selain ruang, sampai akhir baris.

3
Mari codegolf:: sed 's/[^ ]*$/1/'->
Ipor Sircer

Terima kasih banyak! :) Awk tampaknya berfungsi, kecuali untuk baris pertama: 2 6 1 6 1 80 6 1 112 6 1 132 6 1 216 6 1 342 6 1 390 6 1 432 6 1 466 6 1 524 6 1 646 6 1 The baris pertama mencetak nilai 2 dan 3 dua kali?
user203269

@ user203269 versi awk berfungsi dengan baik untuk saya (walaupun dengan masalah
formating

3
awkgolf: awk \$3=1(POSIX tetapi tidak akan bekerja dengan awk dari tahun 70-an seperti yang ditemukan di / bin pada Solaris)
Stéphane Chazelas

yang awksolusi yang benar-benar keren .... dapat Anda menjelaskan pls
mazs

5

Garis-garis dalam output yang diharapkan tampaknya berakhir dalam dua karakter spasi dan memiliki bidang yang dipisahkan oleh satu tab dan satu karakter spasi.

Jika memang itu yang Anda inginkan, maka Anda perlu:

awk -v 'OFS=\t ' '$3="1  "' < infile > outfile

Atau dengan sed:

tab=$(printf '\t')
sed "
  s/[[:blank:]]\{1,\}/$tab /g
  s/[^[:blank:]]\{1,\}[[:blank:]]*$/1  /
  s/^[[:blank:]]*//" < infile > outfile

Mengapa spasi setelah 1?
123

@ 123, seperti yang saya katakan, dalam output OP yang diharapkan, setiap baris berakhir dengan dua karakter spasi.
Stéphane Chazelas

Salah membaca Anda mengatakan bahwa bidang dipisahkan oleh dua spasi dan satu tab. salahku.
123

Hai Stephane, awk ini melakukan tiga nilai pertama dengan benar, lalu menghapus kolom1 baris 2 dan berlanjut tanpa membuat perubahan ..
user203269

1
@ user203269, konversikan file Anda dari MS-DOS ke Unix terlebih dahulu.
Stéphane Chazelas

3

Cukup dengan GNU sed, gunakan -iuntuk mengganti teks langsung dalam file:

sed -i 's:\(.*\s\)\(.*\s\)\(.*\):\1\21:g' textfile

Kolom dicocokkan oleh kelompok regex dalam kurung, menggunakan kembali mereka dengan \1dan \2kemudian menggunakan "1" untuk menggantikan kelompok terakhir.

Dalam kasus penggunaan ini, solusi yang diusulkan menggunakan awkbagus dan pendek juga.


2

ini akan melakukan pekerjaan:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'

cat file.txt | cut -d '' -f-2 | sed 's / $ / 1 /' 646 6 0,5 1 mencetak satu baris (baris terakhir) di terminal, tetapi tidak mengubah file.txt ...
user203269

-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename

Bisakah Anda mengedit posting Anda untuk memasukkan lebih banyak konteks mengapa Anda merasa ini solusinya?
kemotep
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.