Adicionando texto variável ao arquivo de texto por linha

6

Eu tenho um arquivo de texto:

cat test1
ch140/121_------_T_201607061430
ch140/121_------_T_201611070840
ch140/121_------_T_201611071125
ch140/121_------_T_201611071235

Eu quero adicionar a este arquivo, linha por linha, este texto:

/121_------_T_201607061430
/121_------_T_201611070840
/121_------_T_201611071125
/121_------_T_201611071235

O resultado deve ser:

ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Eu usei:

cat test1 | sed -e 's/ch140//' > test2
for a in $(cat test2)
do
????
done

Qual comando posso usar para isso?
Eu tentei usar um comando sed , mas não funcionou.

    
por Oleksii 24.11.2016 / 13:36

3 respostas

4

sed 's/\/121.*/&&/' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Explicação

  • s/old/new/ replace old com new
  • \/121.* match /121 e o que vier depois
  • && o padrão correspondente duas vezes

Você pode adicionar tee ou usar o redirecionamento para salvar em um novo arquivo

sed 's/\/121.*/&&/' test1 | tee test2
    
por Zanna 24.11.2016 / 14:07
4

O comando paste faz o que o cat faz, mas lado a lado. O -d '' é para paste para usar um delimitador vazio, então não há nada entre as seqüências de caracteres.

$ paste -d '' test1 test2 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Caso os arquivos sejam de tamanho desigual, convém dar uma olhada nesta pergunta para evitar resultados desagradáveis.

    
por Tulains Córdova 24.11.2016 / 16:04
3

Você também pode usar awk :

$ awk -F'/' -vOFS="/" '{print $0,$2}' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Aqui estou configurando os separadores de campo de entrada ( -F"/" ) e saída ( -vOFS="/" ) para / . Isso significa que $2 será tudo depois do firt / e até o próximo / . Como há apenas um / por linha, $2 é o texto que você deseja anexar. O script imprimirá cada linha ( $0 ) e, em seguida, anexará o segundo campo ( $2 ).

Você também pode usar a mesma abordagem em Perl:

$ perl -F"/" -anle 'print "$_/$F[1]"' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Como alternativa, você pode usar a mesma abordagem de @ sed answer do Zanna :

$ perl -pe 's#/.*#$&$&#' test1 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
    
por terdon 24.11.2016 / 16:12