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

새로운 형식에서 데이터의 첫 번째 열은 행을 식별하는 두 차이 부분의 첫 번째 열 값입니다. 두 번째 열에는 첫 번째 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가 있는 경우 "< *"정규식 대신 고정 패턴이 필요할 수 있으므로 *방향 표시기 뒤의 리터럴에 공백을 잃어버리고 넣으십시오.

관련 정보