![如何比较 csv 中的当前行与下一行并在 unix 脚本中显示列差异](https://linux22.com/image/177497/%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%20csv%20%E4%B8%AD%E7%9A%84%E5%BD%93%E5%89%8D%E8%A1%8C%E4%B8%8E%E4%B8%8B%E4%B8%80%E8%A1%8C%E5%B9%B6%E5%9C%A8%20unix%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%98%BE%E7%A4%BA%E5%88%97%E5%B7%AE%E5%BC%82.png)
文件.csv
ABC,EFG,22
XYZ,MNO,24
XYZ,MNO,228
SPOT,ID,NUMBER
SPOT,ID,VARCHAR2
INF,SUMMARY,VARCHAR2
INF,SUMMARY,NUMBER
我想比较第一行和第二行并显示 ABC 和 XYZ 不同,第二行和第三行比较应该带来 24 是旧值,228 是新值
如果不同,则按列进行类似比较,然后打印值。我在将当前行与之前的记录进行比较时遇到问题
我可以比较同一条线。下面在某种程度上对我在同一行工作,但要检查前一行我不能。
awk -F: '{if(!($1==$2||$2==$3||$3==$1))printf("%s","not ");print"matched",$0}' file.csv
我还尝试使用 while 循环通过将值分配给另一个变量来读取和比较。
x=""
while IFS= , read -r a b c
do
if [a == x]]
then
echo "$a"
x=$a
done < input.csv
答案1
$ cat tst.awk
BEGIN { FS="," }
NR > 1 {
if (p[0] != $0) {
printf "\nLine %d (%s) != %d (%s)\n", NR-1, p[0], NR, $0
}
for (i=1; i<=NF; i++) {
if (p[i] != $i) {
printf "\tField %d.%d (%s) != %d.%d (%s)\n", NR-1, i, p[i], NR, i, $i
}
}
}
{ split($0,p); p[0]=$0 }
。
$ awk -f tst.awk file.csv
Line 1 (ABC,EFG,22) != 2 (XYZ,MNO,24)
Field 1.1 (ABC) != 2.1 (XYZ)
Field 1.2 (EFG) != 2.2 (MNO)
Field 1.3 (22) != 2.3 (24)
Line 2 (XYZ,MNO,24) != 3 (XYZ,MNO,228)
Field 2.3 (24) != 3.3 (228)
Line 3 (XYZ,MNO,228) != 4 (SPOT,ID,NUMBER)
Field 3.1 (XYZ) != 4.1 (SPOT)
Field 3.2 (MNO) != 4.2 (ID)
Field 3.3 (228) != 4.3 (NUMBER)
Line 4 (SPOT,ID,NUMBER) != 5 (SPOT,ID,VARCHAR2)
Field 4.3 (NUMBER) != 5.3 (VARCHAR2)
Line 5 (SPOT,ID,VARCHAR2) != 6 (INF,SUMMARY,VARCHAR2)
Field 5.1 (SPOT) != 6.1 (INF)
Field 5.2 (ID) != 6.2 (SUMMARY)
Line 6 (INF,SUMMARY,VARCHAR2) != 7 (INF,SUMMARY,NUMBER)
Field 6.3 (VARCHAR2) != 7.3 (NUMBER)