簡體   English   中英

bash:基於第一列的grep完全匹配

[英]bash: grep exact matches based on the first column

我有一個.txt文件,如下所示:

9342432_A1 9342432 1 0 0 0
4392483_A2 4392483 2 0 0 0 
4324321_A3 4324321 1 0 0 0
9342432    9342432 2 0 0 0

例如,我想生成ID為4324321_A3和9342432的子集(基於第一列!)。 我嘗試了以下命令來查找完全匹配:

 grep -E '4324321_A3|9342432'

但是當我使用這一行時,我最終會得到一個這樣的數據集:

9342432_A1 9342432 1 0 0 0
4324321_A3 4324321 1 0 0 0
9342432    9342432 2 0 0 0

問題是匹配部分ID(9342432_A1)的行不應該存在。 誰能幫我這個?

我想最終得到這個:

4324321_A3 4324321 1 0 0 0
9342432    9342432 2 0 0 0

它匹配

9342432_A1 9342432 1 0 0 0

因為它在第二列中有9342432

您需要更新命令以使grep檢查行以這些單詞開頭,即使用^word

$ grep -E '^4324321_A3|^9342432' file
4324321_A3 4324321 1 0 0 0
9342432    9342432 2 0 0 0

為了使其更准確,您還可以使用匹配完整單詞的-w 這樣grep -wE '^4324321_A3|^9342432' file就不會像

4324321_A3something 4324321 1 0 0 0

當您需要匹配文件的特定字段(或列)時,最好使用awk而不是grep類的工具。 你可以寫這樣的東西:

awk '$1 == "STRING_TO_MATCH"' txtfile.txt

這也適用於與第一列不同的列(第二列使用$ 2,第三列使用$ 3,依此類推)。
awk接受正則表達式以及grep。

問候。

您的正則表達式不會檢查ID是否在行的開頭。 只需在正則表達式的開頭包含一個^ ,告訴它只匹配行開頭的ID,然后使用()對備選項進行分組:

grep -E '^(4324321_A3|9342432)\b' <file>

\\b是一個邊界字符,強制它只匹配整個單詞。

在你的grep中包含^開頭和后面的模式空間

在開頭添加行開始,在每個模式的末尾添加單詞邊界

grep -E '^4324321_A3\b|^9342432\b'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM