Come sostituire il contenuto di una colonna specifica con awk?


31

Dato: ci sono 40 colonne in un record. Voglio sostituire la 35a colonna in modo che la 35a colonna venga sostituita con il contenuto della 35a colonna e un simbolo "$". Ciò che è venuto in mente è qualcosa di simile:

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

Funziona ma perché non è possibile quando il numero di colonne è pari a 10k. Ho bisogno di un modo migliore per farlo.

Risposte:



8

Probabilmente ci sono modi più efficienti per farlo. Con questo avvertimento:

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

3

Se il delimitatore di campo è <space>:

sed 's/  */$&/35'

Se il delimitatore di campo è sconosciuto:sed 's/./$&/35'
Underverse il

@Underverse - Non penso sia la stessa cosa. Ciò dovrebbe precedere il 35 ° carattere su una riga di input con il carattere $delimitato o meno. La cosa sopra dovrebbe apporre la 35a occorrenza di un numero qualsiasi di caratteri delimitatori - in altre parole, il 35 ° campo - con il carattere $- non importa quanto i caratteri siano in ciascun campo.
Mikeserv,

Ah, "40 colonne in un record". Ho letto "la 35a colonna" come letteralmente "la 35a colonna del file di testo".
Underverse

3

Per prenotare l'originale Field-Seprator, l'ho fatto. La colonna che volevo cancellare era il numero $ 12.

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

Con gawk -i , se ce l'hai, puoi modificare il file in atto.


1

In caso di problemi con l'utilizzo delle risposte "approvate", sostituirebbe più della semplice prima colonna del file. Uso questo comando generico:

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

Dove:

  • [column] = colonna che vuoi cambiare a partire da 1 (non 0)
  • [replace] = testo che si desidera sostituire

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... ha sostituito un milione di timestamp in pochi secondi !! :)
roblogic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.