我正在尝试比较两个 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
而是在最后一个命令中使用: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