Bash

awk 過濾僅包含單個字母的行

  • May 17, 2022

我有一個看起來像這樣的文件(file1):

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 2 AA 234 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ROW 3 AA 122 XXXXXXXXXXXXXXXXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...

有多個行包含不同數量​​的 X。但是,結果不應包含僅由 X 組成的行,它應該是:

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...

感謝您的幫助!

使用awk,列印最後一個欄位至少有一個字元不是的行X

awk '$NF ~ /[^X]/' file

ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89  WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY

或與grep

grep -v '[[:space:]]XX*$' file

使用標準sed刪除所有包含空格的行,僅X在末尾:

sed '/ X\{1,\}$/d' file

或者,

sed '/ XX*$/d' file

如果給定選項,則使用sed可以理解擴展正則表達式的a:-E

sed -E '/ X+$/d' file

如果文件中的分隔符不是空格而是製表符,則使用[[:blank:]]代替表達式中的初始空格。

對於sed '/RE/d'上面(和下面)的每個變體,等效grep命令將是grep -v 'RE',例如

grep -v ' X\{1,\}$' file

相當於

sed '/ X\{1,\}$/d' file

要刪除末尾僅包含任何單個字元副本的行:

sed '/ \(.\)\1*$/d' file

這匹配一個空格,後跟某個字元,然後匹配零個或多個該特定字元到行尾。匹配的行被刪除。

只是使用相同的想法,以下將刪除末尾僅包含重複序列(例如ABCABCor ABABABAB)的行:

sed '/ \(..*\)\1\1*$/d' file

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