awk 또는 sed를 사용하여 csv diff를 더 읽기 쉬운 형식으로 변환하는 방법

awk 또는 sed를 사용하여 csv diff를 더 읽기 쉬운 형식으로 변환하는 방법

누구든지 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

새로운 형식 - 데이터의 첫 번째 열은 라인을 식별하기 위해 diff의 두 부분 모두에 있는 첫 번째 열의 값입니다. 두 번째 열에는 첫 번째 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가 있는 경우 "< *"정규식보다는 고정 패턴이 필요할 수 있으므로 *방향 표시기 뒤에 문자 그대로 공백을 입력하세요.

관련 정보