删除具有不同数据的重复字段

删除具有不同数据的重复字段

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

登录名和内存信息应该用制表符空格分隔。

我想从这个列表中排除一些名字。

这是我到目前为止所拥有的:

$ 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这样的模式。如果它后面跟着memoryInfomemoryInfo我希望删除第二个。

答案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

相关内容