Remplacez toutes les valeurs d'une colonne par 1


8

J'ai plusieurs fichiers texte contenant 12 lignes et 3 colonnes.

Exemple:

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 

Je veux mettre toutes les valeurs de la troisième colonne à 1 dans toutes les lignes.

La sortie devrait ressembler à ceci:

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  

Quelqu'un connaît-il une commande qui peut résoudre ce problème?

Réponses:


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

1
Cette commande imprime correctement la première ligne du fichier texte dans le terminal, mais ne modifie pas le fichier ...
user203269

rediriger la sortie vers un autre fichierawk '{print $1, $2, "1"}' inputfile > newfile
user1700494

Merci! Cela fonctionne mais n'écrit que la première ligne, les colonnes 1, 2 et 3. Je voudrais écrire les 12 lignes de la même manière :)
user203269

12

essayer

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 mettra le troisième champ à 1

sed (ici GNU ou busybox sedavec son -ioption d'édition sur place)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$est une séquence allant 0de 9et .jusqu'à la fin de la ligne.

sed (golfé 4 octets)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ tout caractère autre que l'espace, jusqu'à la fin de la ligne.

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

Merci beaucoup! :) L'awk semble fonctionner, sauf pour la première ligne: 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 Le la première ligne imprime deux fois la 2e et la 3e valeur?
user203269

@ user203269 la version awk fonctionne bien pour moi (bien qu'avec un problème de formatage)
Archemar

3
awka joué au golf: awk \$3=1(POSIX mais ne fonctionnerait pas avec le awk des années 70 tel que trouvé dans / bin sur Solaris)
Stéphane Chazelas

cette awksolution est vraiment cool .... pouvez-vous expliquer pls
mazs

5

Les lignes de votre sortie attendue semblent se terminer par deux espaces et les champs sont séparés par un onglet et un espace.

Si c'est bien ce que vous voulez, vous aurez besoin de:

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

Ou avec sed:

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

Pourquoi les espaces après 1?
123

@ 123, comme je l'ai dit, dans la sortie attendue de l'OP, chaque ligne se termine par deux caractères d'espace.
Stéphane Chazelas

Vous avez mal compris que les champs étaient séparés par deux espaces et une tabulation. ma faute.
123

Salut Stéphane, Cet awk fait correctement les trois premières valeurs, puis il supprime la ligne 1 de la colonne 1 et continue sans apporter de modifications ..
user203269

1
@ user203269, convertissez d'abord votre fichier MS-DOS en Unix.
Stéphane Chazelas

3

Simplement avec GNU sed, en utilisant -ipour remplacer le texte directement dans le fichier:

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

Les colonnes sont appariés par des groupes regex dans la parenthèse, de les réutiliser avec \1et \2puis en utilisant un « 1 » pour remplacer le dernier groupe.

Dans ce cas d'utilisation, la solution proposée awkest également agréable et courte.


2

cela fera le travail:

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

cat file.txt | coupe -d '' -f-2 | sed '/ $ / 1 /' 646 6 0,5 1 imprime une ligne (la dernière ligne) dans le terminal, mais ne modifie pas le fichier.txt ...
user203269

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

Pourriez-vous s'il vous plaît modifier votre message pour inclure plus de contexte sur la raison pour laquelle vous pensez que c'est la solution?
kemotep
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.