Ersetzen Sie alle Werte in einer Spalte durch 1

8

Ich habe mehrere Textdateien mit 12 Zeilen und 3 Spalten.

Beispiel:

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 

Ich möchte alle Werte der dritten Spalte in allen Zeilen auf 1 setzen.

Die Ausgabe sollte folgendermaßen aussehen:

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  

Kennt jemand einen Befehl, der dieses Problem lösen kann?

user203269
quelle

Antworten:

16
awk '{print $1, $2, "1"}' inputfile
user1700494
quelle
1
Dieser Befehl druckt die erste Zeile in der Textdatei korrekt im Terminal aus, nimmt jedoch keine Änderungen in der Datei vor ...
user203269
awk '{print $1, $2, "1"}' inputfile > newfile
Leiten Sie
Vielen Dank! Es funktioniert, schreibt aber nur die erste Zeile, Spalte 1, 2 und 3. Ich möchte alle 12 Zeilen auf die gleiche Weise
ausschreiben
12

Versuchen

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 setzt das dritte Feld auf 1

sed (hier GNU oder Busybox sedmit der -iOption zur direkten Bearbeitung)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$ist eine Sequenz von 0zu 9und .bis zum Ende der Zeile nach oben.

sed (Golf 4 Bytes)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ jedes andere Zeichen als Leerzeichen bis zum Ende der Zeile.
Archemar
quelle
3
Lassen Sie uns Codegolf :: sed 's/[^ ]*$/1/'->
Ipor Sircer
Ich danke dir sehr! :) Die awk scheint zu funktionieren, mit Ausnahme der ersten Zeile: 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 erste Zeile druckt den 2. und 3. Wert zweimal?
user203269
@ user203269 awk Version funktioniert gut für mich (wenn auch mit einem Formatierungsproblem)
Archemar
3
awkGolf gespielt: awk \$3=1(POSIX, würde aber nicht mit dem Awk aus den 70ern funktionieren, wie in / bin auf Solaris zu finden)
Stéphane Chazelas
dass awkLösung ist wirklich cool .... können Sie erklären , pls
mazs
5

Die Zeilen in Ihrer erwarteten Ausgabe scheinen mit zwei Leerzeichen zu enden und haben Felder, die durch eine Registerkarte und ein Leerzeichen getrennt sind.

Wenn Sie das wirklich wollen, dann brauchen Sie:

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

Oder mit sed:

tab=$(printf '\t')
sed "
  s/[[:blank:]]\{1,\}/$tab /g
  s/[^[:blank:]]\{1,\}[[:blank:]]*$/1  /
  s/^[[:blank:]]*//" < infile > outfile
Stéphane Chazelas
quelle
Warum die Leerzeichen nach 1?
123
@ 123, wie gesagt, in der erwarteten Ausgabe des OP endet jede Zeile mit zwei Leerzeichen.
Stéphane Chazelas
Misread dachte, Sie sagten, Felder seien durch zwei Leerzeichen und einen Tabulator getrennt. mein Fehler.
123
Hallo Stephane, dieser awk macht die ersten drei Werte korrekt, dann löscht er Spalte 1, Zeile 2 und fährt ohne Änderungen fort.
user203269
1
@ user203269, konvertieren Sie zuerst Ihre Datei von MS-DOS nach Unix.
Stéphane Chazelas
3

Einfach mit GNU sed, -ium Text direkt in der Datei zu ersetzen:

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

Die Spalten werden durch regex Gruppen in den Klammern angepasst, die Wiederverwendung von ihnen \1und \2dann ein „1“ mit der letzten Gruppe zu ersetzen.

In diesem Anwendungsfall ist die vorgeschlagene Lösung ebenfalls awknett und kurz.

Labyrinthe
quelle
2

das wird den Job machen:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
Wissam Roujoulah
quelle
cat file.txt | cut -d '' -f-2 | sed 's / $ / 1 /' 646 6 0.5 1 druckt eine Zeile (die letzte Zeile) im Terminal aus, ändert aber nicht die Datei.txt ...
user203269
-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename
Thriller
quelle
Könnten Sie bitte Ihren Beitrag bearbeiten, um mehr Kontext darüber aufzunehmen, warum Sie der Meinung sind, dass dies die Lösung ist?
Kemotep