원본 파일에는 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