Linux
刪除具有不同數據的重複欄位
原始文件
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:
這在整個原始輸出中重複多次。我想搜尋這個文件並創建另一個輸出文本文件,每個使用者應該有 1 行,如下所示:
loginName: memoryInfo:jsHeapSizeLimit:
loginName 和 memoryInfo 應該用 Tab 空格分隔。
我想從這個列表中排除一些名字。
這是我到目前為止所擁有的:
$ 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
,我希望刪除第二個。
您可以使用 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
.