Como passar o número da linha, onde a incompatibilidade ocorreu no awk, para variáveis do shell?

3

Estou tentando comparar dois arquivos csv. Eu quero que os números de linha sejam armazenados em variáveis ou matriz de shell.

Eu tentei algo assim:

   paste <(awk -F, '{print NR,$1}' file1) <(awk -F, '{print $1}' file2) | awk -v var=0 '{ print (($2==$3)?"match":"a[var]="$1); var++}' 

Isso não funcionou. Além disso, 'a' não é uma variável shell aqui. Como proceder com isso? Sugira também outras formas de fazer isso.

Obrigado antecipadamente

    
por Ramana Reddy 19.05.2015 / 07:00

1 resposta

2

Solução :

Com awk imprima apenas números de linha onde houver diferenças e colete todos eles em uma matriz bash . Em vez de usar NR no primeiro subcomando awk , use NR no último comando awk :

line_numbers=($(\
    paste \
        <(awk -F, '{print $1}' file1) \
        <(awk -F, '{print $1}' file2) \
    | awk '{if ($1 != $2) print NR}' \
))

echo "Length: ${#line_numbers[*]}"
for index in ${!line_numbers[@]}; do
    echo "line_numbers[$index] = ${line_numbers[index]}"
done

Exemplo :

> awk '{print NR": "$0}' file1
1: aab
2: b
3: bcbaa
4: ab
5: bb
6: ca
7: ba
8: abacb
9: bccaba

> awk '{print NR": "$0}' file2
1: aab
2: z
3: bcbaa
4: yyz
5: y
6: yx
7: ba
8: abacb
9: z

> bash main.bash
Length: 5
line_numbers[0] = 2
line_numbers[1] = 4
line_numbers[2] = 5
line_numbers[3] = 6
line_numbers[4] = 9
    
por aropan 29.07.2015 / 15:39