Se uma linha começar com {condition}, insira a variável após o 187º caractere

0

Eu tenho um arquivo .txt com > 10k linhas. Algumas das linhas começam com 1,POS,MGC= ou 1,NEG,MGC= . Para essas linhas, quero inserir uma variável após o 187º caractere na linha, preservando o texto depois.

Até agora, o que eu tenho é

awk 'BEGIN{FS=OFS=""}
{if (substr($0,1,10)~"1,...,MGC=")
$187=$variable} inputfile > outputfile

que realmente não funciona de todo.

    
por erik 11.10.2018 / 02:44

3 respostas

2

Usando sed :

sed "/^1,\(POS\|NEG\),MGC=/ s/./
sed "/^1,\(POS\|NEG\),MGC=/ s/./%pre%$variable/187" file
$variable/187" file

. corresponde a qualquer caractere e o sinalizador numérico 187 fará com que s/.../.../ substitua a 187ª correspondência. Juntos, isso significa que o 187º caractere é substituído por si mesmo, seguido pelo valor de $variable .

O /pattern/ principal restringe essa ação às linhas que começam com "1, POS, MGC=" ou "1, NEG, MGC=".

    
por 11.10.2018 / 11:34
1

Usando o perl:

perl -i.bak -spe 's/^(?=1,(POS|NEG),MGC=).{187}\K/$new/' -- -new="$text" file

Teste

line=$(seq 63 | paste -sd,)
lines=( "$line" "1,POS,MGC=$line" "1,NEG,MGC=$line" "1,foo,MGC=$line" )
printf "%s\n" "${lines[@]}" | perl -spe 's/^(?=1,(?:POS|NEG),MGC=).{187}\K/$new/' -- -new="HELLO!"
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
1,POS,MGC=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,HELLO!63
1,NEG,MGC=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,HELLO!63
1,foo,MGC=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
    
por 11.10.2018 / 17:05
1

Tente

awk -vINSVAR="$variable" '/1,(POS|NEG),MGC/ {$0 = substr ($0, 1, 187) INSVAR substr ($0, 188)} 1' file
    
por 11.10.2018 / 11:09