awk를 사용하여 고유 값을 공유하지 않는 행 뒤에 구분 기호를 인쇄합니다.

awk를 사용하여 고유 값을 공유하지 않는 행 뒤에 구분 기호를 인쇄합니다.

중복 제거 도구(rmlint)의 csv 파일이 있습니다. awk를 사용하여 주어진 필드(예: 체크섬)에 대해 동일한 값을 공유하는 행 그룹 뒤에 다이빙 라인을 추가하고 싶습니다.

문서:

type,path,size,checksum
emptydir,"/home/user/tree2/b",0,00000000000000000000000000000000
duplicate_dir,"/home/user/test/b",4,f8772f6fda08bbc826543334663d6f13
duplicate_dir,"/home/user/test/a",4,f8772f6fda08bbc826543334663d6f13
duplicate_dir,"/home/user/tree/b",8,62202a79add28a72209b41b6c8f43400
duplicate_dir,"/home/user/tree/a",8,62202a79add28a72209b41b6c8f43400
duplicate_dir,"/home/user/tree2/a",4,311095bc5669453990cd205b647a1a00

원하는 출력:

type,path,size,checksum
------------------------
emptydir,"/home/user/tree2/b",0,00000000000000000000000000000000
------------------------
duplicate_dir,"/home/user/test/b",4,f8772f6fda08bbc826543334663d6f13
duplicate_dir,"/home/user/test/a",4,f8772f6fda08bbc826543334663d6f13
------------------------
duplicate_dir,"/home/user/tree/b",8,62202a79add28a72209b41b6c8f43400
duplicate_dir,"/home/user/tree/a",8,62202a79add28a72209b41b6c8f43400
------------------------
duplicate_dir,"/home/user/tree2/a",4,311095bc5669453990cd205b647a1a00

awk를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

이전 값을 저장하고 현재 값이 일치하지 않으면 다음 줄을 출력합니다.

awk -F, 'NR > 1 && $NF != prev { print "------------------------" } { prev = $NF } 1'

( $NF마지막 필드이므로 맞게 조정하세요.)

대시 수는 다음과 같이 더 쉽게 사용자 정의할 수 있습니다.

awk -F, 'BEGIN { line = sprintf("%20s", ""); gsub(/ /, "-", line) }
         NR > 1 && $NF != prev { print line } { prev = $NF } 1'

또는 GNU AWK를 사용하세요.

awk -F, 'BEGIN { line = gensub(/ /, "-", "g", sprintf("%20s", "")) }
         NR > 1 && $NF != prev { print line } { prev = $NF } 1'

"20"을 적절한 값으로 변경합니다.

답변2

구분선의 길이(이 경우 20)를 선택할 수 있는 다른 버전은 다음과 같습니다.

$ awk -F, -v i=$(printf -- '-%.0s' {1..20}) '{if(a==$NF){print;next}else{print i};print;a=$NF}' inputfile

type,path,size,checksum
--------------------
emptydir,"/home/user/tree2/b",0,00000000000000000000000000000000
--------------------
duplicate_dir,"/home/user/test/b",4,f8772f6fda08bbc826543334663d6f13
duplicate_dir,"/home/user/test/a",4,f8772f6fda08bbc826543334663d6f13
--------------------
duplicate_dir,"/home/user/tree/b",8,62202a79add28a72209b41b6c8f43400
duplicate_dir,"/home/user/tree/a",8,62202a79add28a72209b41b6c8f43400
--------------------
duplicate_dir,"/home/user/tree2/a",4,311095bc5669453990cd205b647a1a00

관련 정보