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?

Antworten:


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

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.

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

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.


2

das wird den Job machen:

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.