다른 데이터가 포함된 중복 필드 제거

다른 데이터가 포함된 중복 필드 제거

원본 파일에는 FinalResults.txt다음 내용이 포함되어 있습니다.

loginName:name1
memoryInfo:jsHeapSizeLimit:2181038082
session:cabSessionID:
sessionStartTime:

loginName:name1
memoryInfo:jsHeapSizeLimit:2181038080
session:cabSessionID:
sessionStartTime:

loginName:name2
memoryInfo:jsHeapSizeLimit:2181038080
session:cabSessionID:
sessionStartTime:

loginName:name3
memoryInfo:jsHeapSizeLimit:2181038084
session:cabSessionID:
sessionStartTime:

loginName:name4
memoryInfo:jsHeapSizeLimit:2181038080
session:cabSessionID:
sessionStartTime:

memoryInfo:jsHeapSizeLimit:2181038080
session:cabSessionID:
sessionStartTime:

loginName:name5
memoryInfo:jsHeapSizeLimit:2181038080
session:cabSessionID:
sessionStartTime:

loginName:name1
memoryInfo:jsHeapSizeLimit:2181038082
session:cabSessionID:
sessionStartTime:

loginName:name6
memoryInfo:jsHeapSizeLimit:2181038083
session:cabSessionID:
sessionStartTime:

이는 원본 출력 전체에서 여러 번 반복됩니다. 이 파일을 검색하고 다음과 같이 사용자당 한 줄씩 포함하는 또 다른 출력 텍스트 파일을 만들고 싶습니다.

loginName:  memoryInfo:jsHeapSizeLimit:

로그인 이름과 메모리 정보는 탭 공백으로 구분되어야 합니다.

이 목록에서 일부 이름을 제외하고 싶습니다.

이것이 내가 지금까지 가지고 있는 것입니다:

$ grep -e "^loginName\|^memoryInfo" FinalResults.txt | egrep -v 'name1|name2' | awk '$1!=p; {p=$1}' | paste -d"\t" - - > Test.txt

이름을 지운 후 memoryInfo접미사를 남겼습니다 memoryInfo.

다음 출력을 얻으려면 스크립트를 어떻게 수정해야 합니까?

loginName:A memoryInfo:jsHeapSizeLimit: 1Gb
loginName:B memoryInfo:jsHeapSizeLimit: 2Gb
memoryInfo:jsHeapSizeLimit: 3Gb loginName:C
memoryInfo:jsHeapSizeLimit: 4Gb

여기에 이미지 설명을 입력하세요. 이와 관련하여:

loginName:A memoryInfo:jsHeapSizeLimit: 1Gb
loginName:B memoryInfo:jsHeapSizeLimit: 2Gb
loginName:C memoryInfo:jsHeapSizeLimit: 4Gb

Name, memoryInfo기본적으로는 이렇게 되어야 합니다 . memoryInfo뒤에 가 있으면 memoryInfo두 번째 것을 제거하고 싶습니다.

답변1

AWK를 사용하여 이 작업을 수행할 수 있습니다.

첫 번째 솔루션egrep사용자를 제외하려면 유사한 명령을 사용하십시오 .

 egrep -v 'loginName:(name1|name2)' FinalResults.txt | awk '/^loginName:/ { login=$0; } # save line
     /^memoryInfo:jsHeapSizeLimit:/ { 
         if(login!="") { # only if we have a saved loginName line
             printf "%s\t%s\n", login, $0;
             login=""; # clear to avoid printing twice
         }
     }'

문제에 대한 입력을 기반으로 출력은 다음과 같습니다.

loginName:name3 memoryInfo:jsHeapSizeLimit:2181038084
loginName:name4 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name5 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name6 memoryInfo:jsHeapSizeLimit:2181038083

두 번째 해결책확장된 AWK 스크립트 사용 및 별도 파일의 목록 제외

exclude제외하려는 모든 사용자가 포함된 파일을 한 줄에 하나씩 생성한다고 가정해 보겠습니다.

name1
name2

확장된 AWK 스크립트를 사용하고 exclude이 파일을 입력 데이터 파일 이전의 첫 번째 파일로 제공할 수 있습니다.

awk 'NR==FNR {# condition is valid for first file only
        exclude[$0]=1; # add name to exclude map
        next; # stop processing, do not check other rules
     }
     /^loginName:/ { 
         name=substr($0,11); # extract name
         if (!( name in exclude )) login=$0; } # save line if not in exclude list
     /^memoryInfo:jsHeapSizeLimit:/ {
         if(login!="") { # only if we have a saved loginName line
             printf "%s\t%s\n", login, $0;
             login=""; # clear to avoid printing twice
         }
     }' exclude FinalResults.txt

그러면 첫 번째 AWK 스크립트가 생성됩니다 egrep.

답변2

나는 다음 방법으로 그것을했다

awk '/^loginName:/{x=NR+1}(NR<=x){print}' filename| sed "N;s/\n/ /g"| awk '$0 !~ /name[12]/{print $0}'

산출

loginName:name3 memoryInfo:jsHeapSizeLimit:2181038084
loginName:name4 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name5 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name6 memoryInfo:jsHeapSizeLimit:2181038083

관련 정보