Sostituisci tutti i valori in una colonna su 1


8

Ho più file di testo contenenti 12 righe e 3 colonne.

Esempio:

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 

Voglio impostare tutti i valori della terza colonna su 1 in tutte le righe.

L'output dovrebbe essere simile al seguente:

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  

Qualcuno conosce un comando che può risolvere questo problema?

Risposte:


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

1
Questo comando stampa correttamente la prima riga nel file di testo nel terminale, ma non apporta modifiche al file ...
user203269

reindirizzare l'output su un altro fileawk '{print $1, $2, "1"}' inputfile > newfile
user1700494

Grazie! Funziona ma scrive solo la prima riga, colonna 1, 2 e 3. Vorrei scrivere tutte e 12 le righe nello stesso modo :)
user203269

12

provare

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 imposterà il terzo campo su 1

sed (qui GNU o busybox sedcon la sua -iopzione per la modifica sul posto)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$è una sequenza da 0a 9e .fino alla fine della linea.

sed (golfed 4 byte)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ qualsiasi carattere diverso dallo spazio, fino alla fine della riga.

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

Grazie mille! :) Il awk sembra funzionare, ad eccezione della prima riga: 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 Il la prima riga stampa il 2o e 3o valore due volte?
user203269

@ user203269 la versione awk funziona bene per me (anche se con un problema di formattazione)
Archemar,

3
awkgolfed: awk \$3=1(POSIX ma non funzionerebbe con il awk degli anni '70 come si trova in / bin su Solaris)
Stéphane Chazelas

quella awksoluzione è davvero fantastica .... puoi spiegare pls
mazs

5

Le righe nell'output previsto sembrano terminare con due caratteri spaziali e hanno campi separati da una scheda e uno spazio.

Se è davvero quello che vuoi, allora avresti bisogno di:

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

O con sed:

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

Perché gli spazi dopo 1?
123

@ 123, come ho detto, nell'output previsto dell'OP, ogni riga termina con due caratteri spaziali.
Stéphane Chazelas,

Misread pensava che avessi detto che i campi erano separati da due spazi e una scheda. colpa mia.
123

Ciao Stephane, questo awk esegue correttamente i primi tre valori, quindi elimina la colonna 1 riga 2 e continua senza apportare modifiche.
user203269

1
@ user203269, converti prima il tuo file da MS-DOS a Unix.
Stéphane Chazelas,

3

Semplicemente con GNU sed, usando -iper sostituire il testo direttamente nel file:

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

Le colonne sono accompagnati da gruppi regex tra parentesi, riutilizzarli con \1e \2e poi con un "1" per sostituire l'ultimo gruppo.

In questo caso d'uso, anche la soluzione proposta awkè piacevole e breve.


2

questo farà il lavoro:

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

cat file.txt | cut -d '' -f-2 | sed 's / $ / 1 /' 646 6 0,5 1 stampa una riga (l'ultima riga) nel terminale, ma non modifica il file.txt ...
user203269

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

Potresti modificare il tuo post per includere più contesto sul perché ritieni che questa sia la soluzione?
kemotep,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.