지정된 일치 항목을 기반으로 파일에서 중복 항목 제거

지정된 일치 항목을 기반으로 파일에서 중복 항목 제거

중복을 제거하려는 파일에 다음 샘플 텍스트가 있습니다. 최종 목표는 이 파일(그 중 하나는 web:webapi)에서 모든 중복 인스턴스를 제거하는 것입니다.

이 파일은 600MB 이상의 파일입니다.

"nirmal" -> ["app:am","app:am","app:identity_gateway","app:identity_gateway","app:loginsvc","app:loginsvc","app:loginui","app:loginui","app:ticket","app:ticket","app:webapi","app:webapi","ds:config_store","ds:config_store","ds:cts_store","ds:cts_store","ds:user_store","ds:user_store","web:am","web:am","web:identity_gateway","web:identity_gateway","web:loginsvc","web:loginsvc","web:loginui","web:loginui","web:ticket","web:ticket","web:webapi","web:webapi"];
"mbl" -> ["app:phx","web:phx","app:vas","development:mobile","s2:detsvc","s2core:detsvc","txn:detsvc","web:detsvc","app:fidoproxy","app:landing","app:mobile","app:noknok","app:optchart","app:redis","app:sentinel","app:spring","cws:mesg","cws3:wsproxy","s2:billpay","s2:services","s2core:billpay","s2core:services","web:fidoproxy","web:spring","at:admin","at:eqsroll","at:oqsroll","batch:admin","cws:ctnt","cws:risk","cws:user","cws3:acctaggtr","cws3:content","cws3:risk","cws3:rtao","cws3:rtmm","ets:ord","fhs:eqs","fhs:oqs","s2:aarcomm","s2:acctcomm","s2:espsvc","s2:ibsvc","s2core:aarcomm","s2core:espsvc","s2core:ibsvc","txb:b2bsvc","txn:acct","txn:ibank2","txn:olsvc","txn:rtmm","txn:services","txn:wtools","web:aempros_mpublish","web:b2b","web:etsecxml","web:ibxml","web:olxml","web:prospect","web:tablet","web:ticket","web:wtxml","web:xmlacct","web:xmlrtmm","s2:asset","s2core:asset","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg","app:phxcfgsvr","app:phxdshbrd","app:webapiagg","s2core:mblsvc","s2core:snapquotes","s2:mblsvc","s2:snapquotes","web:landing","web:mobile","web:phxcfgsvr","web:phxdshbrd","web:webapiagg"];

Linux에서는 이를 어떻게 수행합니까?

각 줄에 동일한 형식의 텍스트가 포함된 완전한 파일입니다. 각 파일에서 첫 번째 문자열("->"로 구분)을 검색한 다음 해당 값에서 쉼표로 구분된 중복 항목을 찾으려고 합니다. 중복된 콘텐츠가 발견되면 삭제해야 합니다.

답변1

그리고 sed:

sed -e :1 -e 's/\("[^",]*"\)\(.*\),\1/\1\2/;t1'
  • :1루프를 표시하는 점프 마커
  • "[^",]*"필드입니다. 패턴에서 쉼표를 제외하면 패턴이 ","필드로 처리되지 않습니다. 이 필드를 입력하면 \(\)동일한 필드를 다시 참조할 수 있습니다.\1
  • s명령은 쉼표와 함께 동일한 필드의 두 번째 발생을 제거합니다.
  • 대체가 이루어지면 t명령은 시작 부분의 점프 마커로 점프합니다.

답변2

한 가지 방법은 다음과 같습니다.

$ perl -lne '/^(.*?->\s*\[)(.*)(\].*)/; $k{$_}++ for split(/,/,$2); 
             print "$1", join ",", keys(%k), "$3"' file
"nirmal" -> ["web:webapi","web:identity_gateway","ds:config_store","app:ticket","ds:user_store","web:loginsvc","ds:cts        _store","web:loginui","web:am","ds:cts_store","app:loginui","app:am","app:identity_gateway","app:webapi","web:ticket","app:loginsvc",];
"mbl" -> ["s2:acctcomm","cws:mesg","txn:olsvc","app:loginsvc","web:b2b","app:loginui","app:optchart","app:phxcfgsvr","cws3:risk","s2core:billpay","s2:detsvc","app:spring","app:phxdshbrd","ds:user_store","web:ticket","batch:admin","at:eqsroll","s2:asset","s2core:mblsvc","txn:acct","app:am","s2:espsvc","development:mobile","web:fidoproxy","app:webapi","txn:rtmm","s2:mblsvc","app:redis","cws:user","cws3:acctaggtr","ds:cts_store","txn:detsvc","web:mobile","app:webapiagg","txb:b2bsvc","fhs:oqs","cws3:wsproxy","web:landing","web:olxml","fhs:eqs","web:prospect","s2core:ibsvc","cws:risk","web:phx","s2:ibsvc","s2core:espsvc","txn:services","web:ibxml","web:tablet","at:admin","web:identity_gateway","web:spring","web:phxdshbrd","web:phxcfgsvr","s2core:snapquotes","app:sentinel","s2core:asset","ets:ord","cws3:rtmm","web:loginui","txn:wtools","web:loginsvc","s2:snapquotes","app:fidoproxy","web:etsecxml","s2:aarcomm","web:am","web:wtxml","app:noknok","ds:config_store","app:ticket","txn:ibank2","s2core:services","s2:billpay","web:detsvc","app:landing","cws3:content","web:aempros_mpublish","s2core:aarcomm","app:mobile","web:webapiagg","s2core:detsvc","web:webapi","cws3:rtao","app:identity_gateway","web:xmlrtmm","web:xmlacct","ds:cts        _store","s2:services","at:oqsroll","app:vas","app:phx","cws:ctnt",];

설명하다

  • perl -lne-e: 입력 파일의 각 줄에서 ( )에 지정된 스크립트를 실행합니다 -n. -l입력에서 후행 줄바꿈을 제거하고 각 호출에 줄바꿈을 추가합니다 print.
  • /^(.*?->\s*\[)(.*)(\].*)/: 각 입력 라인에서 세 개의 데이터 세트를 일치시킵니다. 첫 번째는 .*?->\s*\[파일의 시작 부분부터 첫 번째 ->, 그 다음 0개 이상의 공백 문자, 그 다음 \[. 패턴이 괄호 안에 있으므로 이라고 부를 수 있습니다 $1. 다음으로 마지막 항목 ]( .*))까지 모두 일치시킵니다. 이것은 ~이 될 것이다 $2. 마지막으로 나머지 줄 ( \].*)을 일치시켜 가 됩니다 $3.
  • $k{$_}++ for split(/,/,$2);: 중복을 제거하는 방법은 다음과 같습니다. 분할하여 $2(중복 데이터)를 배열에 넣은 ,다음 해당 배열의 각 요소를 해시의 키로 사용합니다 %k. 해시 키는 항상 고유하므로 이는 제거됩니다 $2.
  • print "$1", join ",", keys(%k), "$3"': 이제 원본, 줄의 시작, 쉼표로 연결된 해시 키 $1, 마지막으로 줄의 나머지 부분인 을 인쇄합니다. 이렇게 하면 원래 입력 순서가 유지되지 않지만 중복된 내용은 제거됩니다.%k$3

관련 정보