Как передать номер строки, в которой произошло несоответствие в awk, переменным оболочки?

Я пытаюсь сравнить два 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» здесь не является переменной оболочки. Как поступить с этим? Также предложите другие способы сделать это.

Спасибо заранее

3
задан 19 May 2015 в 08:22

1 ответ

Решение:

С 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
2
ответ дан 19 May 2015 в 18:22
  • 1
    Мои объемы SSD похожи на это: Часть 1: 537 МБ — свободные 532 МБ (полные 0,9%) Системный FAT/dev/sda1 EFI (32-разрядная версия) — Смонтированный в/boot/efi и 2 другом 1:Linux Подкачка файловой системы ext4 2:Linux – Berk Sizgin 18 August 2016 в 15:27

Другие вопросы по тегам:

Похожие вопросы: