たとえば、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
$1
awk
file2.txt
(FNR
これよりも小さい)を処理するときは、NR
この関数を使用して入力行全体で文字列を見つけます()index
。そうであれば、0より大きい開始位置が返されて印刷され、それ以外の場合は印刷されます。patterns[FNR]
$0
index()
true
false
答え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」です。