Como usar o sed para substituir um padrão no final de cada linha em um arquivo com texto fixo?

3

Eu quero comparar dois arquivos com cerca de 40 MB de valores separados por vírgulas com linhas como esta:

hstar,default,"T9883Z ",0d59,c801,7332,5,20120914,4.343618767

Para os dois arquivos, a última entrada que é 4.343618767 no exemplo acima varia entre os dois arquivos, mas quase todos os outros campos correspondem de forma idêntica.

Eu preciso diferenciar os dois arquivos para localizar os poucos lugares onde as entradas, além da última, variam entre os dois arquivos.

Estou pensando que a maneira mais fácil de fazer isso é usar o SED para processar os dois arquivos e normalizar o último campo, procurando o padrão numérico após a sétima vírgula e substituindo-o por uma cadeia fixa como 9.999999999 em cada linha e então um diff simples funcionará.

No entanto, não sei como criar um comando sed para localizar a sétima vírgula e substituir a sequência restante no final da linha por uma string fixa. Como seria um comando tão sed? Eu imagino que precisaria usar uma expressão regular, mas não tenho certeza de como iniciar o padrão após a sétima vírgula.

    
por WilliamKF 17.09.2012 / 16:12

3 respostas

7

Você não precisa procurar a sétima coluna. Basta ir para o último:

sed 's/,[^,]*$/,9.9999999999/'

Explicação:

,    match the comma
[    beginning of a character group
 ^   negation, i.e. do not match the following characters
 ,   comma
]    end of a character group
*    repeat the preceding thing zero or more times
$    match the end of line
    
por 17.09.2012 / 16:17
0

sed "s/,[0-9].[0-9]\+\$//" <yourfile> produzirá linhas como esta:

hstar,default,"T9883Z ",0d59,c801,7332,5,20120914

    
por 17.09.2012 / 16:19
0

Awk é uma ferramenta muito mais limpa para processar dados tabulares:

awk -F ',' ' { print $1,$2,$3,$4,$5,$6 }' file1 > temp1
awk -F ',' ' { print $1,$2,$3,$4,$5,$6 }' file2 > temp2
diff temp1 temp2
    
por 12.11.2014 / 00:19

Tags