누구든지 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가 있는 경우 "< *"
정규식 대신 고정 패턴이 필요할 수 있으므로 *
방향 표시기 뒤의 리터럴에 공백을 잃어버리고 넣으십시오.