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?

pengguna203269
sumber

Jawaban:

16
awk '{print $1, $2, "1"}' inputfile
pengguna1700494
sumber
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.
Archemar
sumber
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
Stéphane Chazelas
sumber
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.

labirin
sumber
2

ini akan melakukan pekerjaan:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
Wissam Roujoulah
sumber
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
Film thriller
sumber
Bisakah Anda mengedit posting Anda untuk memasukkan lebih banyak konteks mengapa Anda merasa ini solusinya?
kemotep