たとえば、文字列のリストを含むテキストファイルがあります。a.txt
one
two
three
次の文字列のリストを含む他のテキストファイルがあります。b.txt
threetwo
onetwothree
zero
twozero
私がしたいのは、2つのフィールドを比較し、そのフィールドの1つにb.txt
次の内容が含まれているかどうかを見つけることです。a.txt
この場合の出力例は次のとおりです。
threetwo > two, three
onetwothree > one, two, three
twozero > two
私の説明が十分に説明されていない場合は、C#で作成して期待どおりの結果を得ることができます。
List<string> allElements = new List<string> { "one", "two", "three" };
string str = "onetwothree";
var containingElements = allElements.Where(element => str.Contains(element));
foreach(string element in containingElements)
{
Console.WriteLine(element);
}
上記のコードを実行できますdotnetfiddle.net
私はawkを使ってこれを達成したいと思います。どんな助けでも大変感謝します。
答え1
awk関数の戻り値を使用して、inの行にinの部分文字列が含まれていることをindex
確認できます。b.txt
a.txt
index(in, find) Search the string in for the first occurrence of the string find, and return the position in characters where that occurrence begins in the string in.
たとえば、
awk '
NR==FNR{strings[$1]; next}
{
m = ""
for(s in strings){
if(index($0,s) > 0) m = (m=="") ? s : m ", " s
}
}
m != "" {print $0, ">", m}
' a.txt b.txt
threetwo > three, two
onetwothree > three, two, one
twozero > two
a.txt
awkでは、配列の巡回順序(この場合は構成された部分文字列の配列)は保証されません。