Wie ersetze ich den Inhalt einer bestimmten Spalte durch awk?


31

Gegeben: Ein Datensatz enthält 40 Spalten. Ich möchte die 35. Spalte ersetzen, sodass die 35. Spalte durch den Inhalt der 35. Spalte und ein "$" -Symbol ersetzt wird. Was mir in den Sinn kam, ist so etwas wie:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

Es funktioniert aber, weil es nicht machbar ist, wenn die Anzahl der Spalten so groß wie 10k ist. Ich brauche einen besseren Weg, um das zu tun.

Antworten:



8

Es gibt wahrscheinlich effizientere Möglichkeiten, dies zu tun. Mit dieser Einschränkung:

awk '{$35 = $35"$"; print}' infile > outfile

3

Wenn das Feldtrennzeichen ist <space>:

sed 's/  */$&/35'

Wenn das sed 's/./$&/35'
Feldtrennzeichen nicht bekannt

@Underverse - Ich glaube nicht, dass das dasselbe ist. Das sollte dem 35. Zeichen in einer Eingabezeile mit $oder ohne Zeichen vorangestellt werden . Die obige Angabe sollte das 35. Vorkommen einer beliebigen Anzahl von Begrenzungszeichen - mit anderen Worten das 35. Feld - mit dem $Zeichen verbinden, unabhängig davon, wie Zeichen in jedem Feld stehen.
MikeServ

Ah, "40 Spalten in einem Datensatz". Ich habe "die 35. Spalte" als wörtlich "die 35. Zeichenspalte der Textdatei" gelesen.
6.

3

Um den originalen Field-Seprator zu reservieren, habe ich das gemacht. Die Spalte, die ich ausblenden wollte, war die Nummer $ 12.

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

Mit gawk -i, wenn Sie es haben, können Sie die Datei an Ort und Stelle bearbeiten.


1

Bei Problemen mit den "genehmigten" Antworten würde dies mehr als nur die erste Spalte in der Datei ersetzen. Ich benutze diesen generischen Befehl:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

Woher:

  • [column] = Spalte, die Sie ändern möchten, beginnend mit 1 (nicht mit 0)
  • [replace] = Text, den Sie ersetzen möchten

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... tauschte in wenigen Sekunden eine Million Zeitstempel aus !! :)
Roblogic
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.