あるリストに別のリストに含まれる文字列が含まれていることを確認する

あるリストに別のリストに含まれる文字列が含まれていることを確認する

たとえば、file1.txt などの文字列のリストがあります。

a
B
ccc
    D
   E
 f

そして別の文字列のリスト、file2.txt:

    a x y z
  43 5 B aa_f
    <|ccc
 |D>
    E
                            FFF

file2.txtの各行に、file1.txtの対応する行に含まれる切り捨てられた文字列が含まれていることを確認したい(したがって、周囲にスペースがない)。たとえば、2つのファイルの行2にはが含まれているため、Bこのテストはとして評価する必要がありますtrue。ただし、2つのファイルの最後の行は、その行fの文字がfile1.txtに含まれていてfile2.txtに含まれていないため、部分文字列関係ではありませんf

答え1

文字列にスペースがないと仮定すると、file1.txt次のawkベースのアプローチが機能します。

awk 'NR==FNR{patterns[FNR]=$1} FNR<NR{if (index($0,patterns[FNR])>0) print "true"; else print "false"}' file1.txt file2.txt

あなたの例は、これが生成されます

true
true
true
true
true
false

いくつかの説明:私たちは両方のawkファイルを読みましたが、別の方法で処理しました。

  • グローバルラインカウンタと同じようにfile1.txt表示されるFNR「ファイル別ラインカウンタ」を処理するとき、すべての(切り捨てられた)文字列を -internal(ラインのスペースで区切られた最初のフィールド)配列に登録します。行番号で(1から始まることに注意してください)NR$1awk

  • file2.txtFNRこれよりも小さい)を処理するときは、NRこの関数を使用して入力行全体で文字列を見つけます()index。そうであれば、0より大きい開始位置が返されて印刷され、それ以外の場合は印刷されます。patterns[FNR]$0index()truefalse

答え2

awk 'ARGIND == 1 { a[NR]=$1;     next }
     $0 ~ a[FNR] { print "true"; next }
                 { print "false"      }' ex1 ex2

Awkでは、「cond {action}」構造でプログラムを書くことを好みます。これは@AdminBeeソリューションと非常によく似ています。

  • ARGIND ==1- 最初の引数の場合:最初の単語を保存します。
  • $0 ~ a[FNR]- 行($0)に格納されている同族が含まれている場合は「true」、それ以外の場合は「false」です。

関連情報