Como adicionar palavras a uma coluna existente

3

Eu tenho um arquivo delimitado por tabulação com 10 colunas e em uma das colunas (com cerca de 40 milhões de linhas), gostaria de adicionar uma palavra antes da entrada existente em cada linha (mesma palavra em cada linha!) e uma ; após a entrada.

por exemplo. duas linhas antes

1 2 3 4 5 6 7 8 text still more text in this column 10
1 2 3 4 5 6 7 8 text2 still more text in this column 10

para

1 2 3 4 5 6 7 8 test=text; still more text in this column 10
1 2 3 4 5 6 7 8 test=text2; still more text in this column 10

No final do dia, é a função básica de "concatenar" no Excel, mas não posso usar o Excel para arquivos tão grandes e também preciso migrar para o Linux de qualquer maneira.

Eu olhei para perguntas concatenadas aqui no fórum, mas eu só encontrei tópicos lidando com a fusão de duas strings, por exemplo.

foo="Hello"
foo="$foo World"
echo $foo  

mas não usando variáveis.

    
por desperation 03.08.2014 / 09:52

2 respostas

4

Isso é exatamente o que awk é bom em:

awk -F'\t' -vOFS='\t' '{ $9 = "test=" $9 ";" }1'

-F'\t' diz para usar campos separados por tabulações. -vOFS='\t' diz para usar abas na saída também. O corpo real dele é o último argumento: é um pequeno programa que diz para cada linha alterar o valor de $9 (o nono campo) para a concatenação de "test=", seu valor original e ";". Deixamos todos os outros campos intactos. O% final1 é para informar awk para imprimir a nova linha embora tenhamos feito algo a ela.

Se eu der sua entrada (com as abas inseridas):

$ cat data
1   2   3   4   5   6   7   8   text    still more text in this column 10
1   2   3   4   5   6   7   8   text2   still more text in this column 10

então eu posso executar o comando acima:

$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data
1   2   3   4   5   6   7   8   test=text;  still more text in this column 10
1   2   3   4   5   6   7   8   test=text2; still more text in this column 10

e obtenha a saída desejada. Você pode salvá-lo em um arquivo com o redirecionamento > :

$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data > processed-data
    
por 03.08.2014 / 10:03
4

Com o GNU sed :

sed 's/[^\t]*/text=&;/9'

isto é, substitua a 9ª seqüência de caracteres que não são guias por text=&; (onde & significa a parte correspondente).

Em sistemas com outras implementações sed , talvez seja necessário inserir o caractere de tabulação literalmente em vez de \t .

    
por 03.08.2014 / 10:57