他のデータを含む重複フィールドの削除

他のデータを含む重複フィールドの削除

ソースファイルには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後ろにいる場合は、memoryInfo2番目のものを削除したいと思います。

ベストアンサー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

おすすめ記事