![删除具有不同数据的重复字段](https://linux22.com/image/148566/%E5%88%A0%E9%99%A4%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E6%95%B0%E6%8D%AE%E7%9A%84%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AE%B5.png)
原始文件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
这样的模式。如果它后面跟着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