![현재 행을 csv의 다음 행과 비교하고 Unix 스크립트에서 열 차이를 표시하는 방법](https://linux55.com/image/177497/%ED%98%84%EC%9E%AC%20%ED%96%89%EC%9D%84%20csv%EC%9D%98%20%EB%8B%A4%EC%9D%8C%20%ED%96%89%EA%B3%BC%20%EB%B9%84%EA%B5%90%ED%95%98%EA%B3%A0%20Unix%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%97%B4%20%EC%B0%A8%EC%9D%B4%EB%A5%BC%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.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)