
カンマで区切られた文字列を含むファイルがあります。文字列にはドット (つまり、英数字だけではない) が含まれる場合があります。次に例を示します。
site1.com,Level1.2
site2.com,Level1.1,Level1.0,Level1.2
site3.com,Level1.2
site4.com,Level1.2,Level1.1,Level1.0,Levelv3
siteLevel1.2,Levelv2
Level1.2,Levelv2
サイト名を検索する必要があります (サイト名には特定の形式はありません。つまり、常に .com で終わるわけではないので、最初の列がどのようになるかを考慮する必要はありません)。
私は、のみ特定の文字列が含まれています。この例では、Level1.2
排他的に(Level1.1もLevel1.0もなくLevel3もない)前か後か)。次に、条件に一致する結果を新しいファイルに出力します(Level1.2 のみが含まれます)。検索キーワードは 2 列目から始まります(サイト名に一致するパターンが見つかる検索結果は不要です)。
したがって、Level1.2 を検索する場合、新しいファイルには次の内容が含まれている必要があります。
site1.com,Level1.2
site3.com,Level1.2
しかし、私のコマンドの結果は次のようになります:
site1.com,Level1.2
site3.com,Level1.2
siteLevel1.2,Levelv2
Level1.2,Levelv2
名前に Level1.2 が含まれるサイトがある場合、最初の列は気にしないのでカウントしないでください。
このコマンドを試してみましたが、うまくいきました。唯一の問題は、最初の列の検索文字列の出現を無視して検索する必要があることです。
awk '/Level1.2/ && !/Level1.1/ && !/Level1.0/ !/Level3/' myfile.txt > result.txt
答え1
これを試すことができますawk
:
awk -F, '$2=="Level1.2" && NF==2' myfile.txt
入力区切り文字は に設定されています,
。このコマンドは、2 番目のフィールドに一致する文字列が含まれる 2 つのフィールドを含む行を出力します。
答え2
以下の作品:
grep '^[^,]*,Level1\.2' myfile.txt | grep -v ',Level.*Level'
これは、最初のフィールドと末尾のカンマをスキップし、 との一致を検索します。Level1.2
その後、 に続くすべてのレコードを無視して、結果をフィルタリングしますLevel
(Level
最初のフィールドには、先頭にカンマが付いていません)。
Level1.2
文字列が含まれていない限り、他のテキストを に追加できると想定していますLevel
。そうでない場合は、より単純な次の方法を使用できます。
grep '^[^,]*,Level1\.2$' myfile.txt