Bash
awk 過濾僅包含單個字母的行
我有一個看起來像這樣的文件(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
這匹配一個空格,後跟某個字元,然後匹配零個或多個該特定字元到行尾。匹配的行被刪除。
只是使用相同的想法,以下將刪除末尾僅包含重複序列(例如
ABCABC
orABABABAB
)的行:sed '/ \(..*\)\1\1*$/d' file