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.