ソースファイルには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
2番目のものを削除したいと思います。
答え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
2番目の解決策拡張AWKスクリプトの使用と別ファイルのリストの除外
exclude
除外するすべてのユーザーが含まれているファイルを1行に1つずつ作成するとします。
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