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?

user203269
la source

Réponses:

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

labyrinthes
la source
2

cela fera le travail:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
Wissam Roujoulah
la source
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
Thriller en francais
la source
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