Text-Processing

兩個文件之間的公共線

  • January 15, 2021

我在終端上執行了以下程式碼。

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

這並沒有給我兩個文件之間的共同點。我在那裡想念什麼?

用於comm -12 file1 file2獲取兩個文件中的公共行。

您可能還需要對文件進行排序以comm按預期工作。

comm -12 <(sort file1) <(sort file2)

來自man comm

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

**或者使用grep**命令,您需要添加-x選項以將整行匹配為匹配模式。該F選項grep將匹配模式作為字元串而不是正則表達式匹配。

grep -Fxf file1 file2

或使用awk.

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

這是將file1seen的整行讀取到一個以鍵為整行的數組中呼叫(awk代表整$0行)。

我們用作NR==FNR條件僅針對第一個輸入fle1而不是file2執行其後續塊,因為NRinawk指的是目前處理行號,並且FNR指的是所有輸入中的目前行號。soNR對於每個輸入文件FNR都是唯一的,但對於所有輸入都是唯一的。

next那裡告訴awk不要繼續休息程式碼並重新開始,直到wanNR不等於FNR這意味著file1讀取的所有行awk

然後 nextseen[$0]只會為第二個file2執行,並且對於**file2中的每一行都將查看數組並列印該行在數組中確實存在的位置。

另一個簡單的選擇是使用sortand uniq

sort file1 file2|uniq -d

這將列印兩個排序的文件,然後uniq -d只列印重複的行。但是,當兩個文件本身都沒有重複的行時,這是授予的,否則即使兩個文件中都有重複的行,也始終授予以下權限。

uniq -d <(sort <(sort -u file1) <(sort -u file2))

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