Я пытаюсь сравнить два CSV-файла. Я хочу, чтобы номера строк были сохранены в переменных оболочки или массиве.
Я пробовал что-то вроде этого:
paste <(awk -F, '{print NR,$1}' file1) <(awk -F, '{print $1}' file2) | awk -v var=0 '{ print (($2==$3)?"match":"a[var]="$1); var++}'
Это не сработало. Более того, «a» здесь не является переменной оболочки. Как поступить с этим? Также предложите другие способы сделать это.
Спасибо заранее
Решение:
С awk
распечатайте только номера строки, где существуют различия и собирают их всех в a bash
массив. Вместо использования NR
в первом awk
подкоманда, использовать NR
в последнем 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
Пример:
> 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