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.

Marcus Thornton
fonte

Respostas:

35

Você pode fazer assim:

awk '$35=$35"$"'
cuonglm
fonte
8

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

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

Se o delimitador de campo for <space>:

sed 's/  */$&/35'
mikeserv
fonte
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.

zee
fonte
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
Jason G
fonte
awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... substituiu um milhão de carimbos de hora em alguns segundos !! :)
roblogic