Como substituir o conteúdo de uma coluna específica pelo awk?


31

Dado: existem 40 colunas em um registro. Quero substituir a 35ª coluna para que ela seja substituída pelo conteúdo da 35ª coluna e pelo símbolo "$". O que veio à mente é algo como:

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

Funciona, mas porque é inviável quando o número de colunas é tão grande quanto 10k. Eu preciso de uma maneira melhor de fazer isso.

Respostas:



8

Provavelmente existem maneiras mais eficientes de fazer isso. Com essa ressalva:

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

3

Se o delimitador de campo for <space>:

sed 's/  */$&/35'

Se o delimitador de campo for desconhecido:sed 's/./$&/35'
Underverse

@ Undererverse - Eu não acho que é a mesma coisa. Isso deve prefixar o 35º caractere em uma linha de entrada com o $delimitado ou não. O item acima deve afixar a 35ª ocorrência de qualquer número de caracteres delimitadores - em outras palavras, o 35º campo - com o caractere $- não importa como os caracteres estejam em cada campo.
mikeserv

Ah, "40 colunas em um registro". Eu li "a 35ª coluna" como literalmente "a coluna de 35 caracteres do arquivo de texto".
Underverse

3

Para reservar o Seprator de Campo original, eu fiz isso. A coluna que eu queria colocar em branco era o número $ 12.

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

Com gawk -i, se você o tiver, poderá editar o arquivo no local.


1

Se tivesse problemas ao usar as respostas "aprovadas", substituiria mais do que apenas a primeira coluna do arquivo. Eu uso este comando genérico:

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

Onde:

  • [column] = coluna que você deseja alterar começando com 1 (não 0)
  • [replace] = texto que você deseja substituir

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... substituiu um milhão de carimbos de hora em alguns segundos !! :)
roblogic
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.