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.