File-Comparison

檢查一個列表是否包含另一個列表中包含的字元串

  • February 3, 2020

我有一個字元串列表,比如 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 行都包含B,因此該測試的計算結果應為true。但是,兩個文件中的最後一行不在子字元串關係中,因為 file1.txt 包含f並且 file2.txt 在該行中沒有任何f字元。

假設您的字元串中不包含空格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的“每個文件行計數器”,等於NR全域行計數器時,我們只需$1awk-internal數組,以行號為索引(注意這些以 1 開頭)。
  • 在處理file2.txt(FNR現在小於 NR) 時,我們使用該函式在整個輸入行 ( )中index查找字元串。如果是這樣,將返回一個大於 0 的起始位置,然後我們 print ,否則我們 print 。patterns[FNR]``$0``index()``true``false

引用自:https://unix.stackexchange.com/questions/565493