如何将 awk 中出现不匹配的行号传递给 Shell 变量?

如何将 awk 中出现不匹配的行号传递给 Shell 变量?

我正在尝试比较两个 csv 文件。我希望将行号存储到 shell 变量或数组中。

我尝试了这样的事情:

   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' 在这里不是 shell 变量。如何处理?还建议使用其他方法。

提前致谢

答案1

解决方案

仅打印awk存在差异的行号并将它们全部收集到数组中。不要在第一个子命令中使用,bash而是在最后一个命令中使用:NRawkNRawk

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

相关内容