![awk 또는 sed를 사용하여 csv diff를 더 읽기 쉬운 형식으로 변환하는 방법](https://linux55.com/image/50936/awk%20%EB%98%90%EB%8A%94%20sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20csv%20diff%EB%A5%BC%20%EB%8D%94%20%EC%9D%BD%EA%B8%B0%20%EC%89%AC%EC%9A%B4%20%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
누구든지 awk 또는 sed를 사용하는 방법에 대한 예를 줄 수 있습니까(주로 csv 데이터에 대해 grep 및 cut을 사용하기 때문에 어느 것을 사용하지 않았는지 확실하지 않음) 두 가지의 차이점을 변환합니다. .csv 파일은 더 읽기 쉬운 파일.
예를 들어 이전 .csv 파일과 새 .csv 파일에서 차이점을 생성한 경우 실제로는 많은 수의 열로 인해 더 복잡해질 수 있습니다.
2,3c2,3
< Barbara,1093,19
< Magdaline,2093,20
\ No newline at end of file
---
> Barbara,1011,19
> Magdaline,12093,20
\ No newline at end of file
이 형식으로 어떻게 변환할 수 있습니까?
Barbara 1093 1011
Magdaline 2093 12093
새로운 형식에서 데이터의 첫 번째 열은 행을 식별하는 두 차이 부분의 첫 번째 열 값입니다. 두 번째 열에는 첫 번째 csv 파일의 데이터(이전 값)가 포함되고, 세 번째 열에는 두 번째 csv 파일의 값(새 값)이 포함됩니다.
awk 또는 sed를 통해 이러한 텍스트 변환을 어떻게 수행할 수 있나요?
감사해요.
답변1
두 개의 연관 배열과 함께 awk를 사용하십시오. 이 같은:
awk -F, '
/^</{sub("< *","",$1);old[$1]=$2}
/^>/{sub("> *","",$1);new[$1]=$2}
END{ for(k in old) print k,old[k],new[k] }
'
원한다면 모든 것을 공백으로 구분하여 한 줄로 연결할 수 있지만 저는 여러 줄을 선호합니다. ;) 다음은 예입니다.
sauer@humpy:~$ cat file
< a,b,c
> a,d,e
gibberish
< 1,2,3
> 1,4,5
sauer@humpy:~$ awk -F, '
/^</{sub("< *","",$1);old[$1]=$2}
/^>/{sub("> *","",$1);new[$1]=$2}
END{ for(k in old) print k,old[k],new[k] }
' < file
a b d
1 2 4
아, 그리고 오래된 awk가 있는 경우 "< *"
정규식 대신 고정 패턴이 필요할 수 있으므로 *
방향 표시기 뒤의 리터럴에 공백을 잃어버리고 넣으십시오.