Linux

刪除具有不同數據的重複欄位

  • February 21, 2019

原始文件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

刪除名稱後,我只剩memoryInfomemoryInfo.

如何修改我的腳本以獲取以下輸出:

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.

引用自:https://unix.stackexchange.com/questions/502115