AWK para substituir uma linha começa com um arquivo grande [fechado]

0

Eu gostaria de substituir uma linha no arquivo que começa com o conteúdo da variável $cont , usando awk .

5473  12G Ju 2 06:32 part3
5423  11G Ju 6 07:32 part4
573  11G Ju 2 08:21 part5
5473  11G Ju 6 09:12 part6
5423  1G Jl 6 09:32 part7

Estou usando sed agora, mas estou demorando muito para fazer o mesmo.

sed code é dado abaixo.

Agora localizarei e excluo a linha que começa com $cont e grave o $cont no arquivo.

cont="foo"
 newLineCont ="this is new line"
    parallel -a test.txt -k --block 30M --pipe-part "sed -i /^$cont/d" test.txt
      echo $newLineCont >> test.txt

queria pesquisar e substituir linhas no arquivo que começa com o conteúdo da variável $ cont pelo conteúdo de $ newLineCont usando o AWK

    
por Juhan 02.08.2018 / 09:08

1 resposta

1

Substituindo cada linha inteira por $newLineCont se o primeiro campo delimitado por espaço em branco for igual a $cont :

awk -v c="$cont" -v nc="$newLineCont" '$1 == c { $0 = nc } 1' <infile >outfile

Isso lerá a partir de infile e criará um novo arquivo chamado outfile . Se o primeiro campo de uma linha for igual a $cont , toda a linha será substituída por $newLinecont .

O trailing 1 é uma maneira curta de escrever { print } e fará com que todas as linhas sejam exibidas.

Analisando Stéphane Chazelas abaixo em conta (nos casos em que uma ou ambas as variáveis contiverem barras invertidas):

env c="$cont" nc="$newLineCont" awk '$1 == ENVIRON["c"] { $0 = ENVIRON["nc"] } 1' <infile >outfile

Usando sed :

sed "s/^$cont[^0-9].*/$newLineCont/" <infile >outfile

Com sed , precisamos ter mais cuidado para corresponder à coisa correta sem a expressão regular. Se $cont for 12 , não queremos corresponder as linhas que começam com 123 . É por isso que coincidi explicitamente com um não-dígito depois de $cont com [^0-9] (suponho que $cont seja um número).

Assim como o comando awk , ele lê infile e grava em outfile .

Se $cont ou $newLineCont contiver barras, elas precisarão ter escape como \/ , e se $cont contiver qualquer outro caractere especial em expressões regulares, elas também precisarão ser escapadas corretamente.

    
por 02.08.2018 / 10:15