Text-Processing
如何添加基於正則表達式的列
我有一個文件 bla.tsv (FS =
\t
):>hCoV-19/xxx/xxx-YYY/xxx >hCoV-19/xxx/xxx-ZZZ/xxx
精確 :
- 如果一個字元真的是寫出來的,那是因為它會按原樣出現在每一行中
- 如果一個字元寫成xxx,那是因為它會出現,但在每一行之間是不同的(即它可以是一組字母或數字或其他)
- 字元 YYY 和 ZZZ 是我感興趣的模式,可以是數字或字母
我想轉換文件以獲得一個新列:
YYY >hCoV-19/xxx/xxx-YYY/xxx ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
我知道我必須在第三個之後找到一個匹配的正則表達式
/
並返回到上一個-
,但經過多次嘗試後我還沒有找到它https://regexr.com/
。您知道如何進行正則表達式以及如何將結果放在第一列嗎?謝謝
$ cat file >hCoV-19/xxx/xxx-YYY/xxx >hCoV-19/xxx/xxx-ZZZ/xxx
$ awk -F '[/-]' '{ printf "%s %s\n", $5, $0 }' file YYY >hCoV-19/xxx/xxx-YYY/xxx ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
上面的程式碼將數據視為在或
awk
上劃分為欄位的行。第五個這樣的欄位是您要添加到每一行的欄位,這就是語句的作用。/``-``printf
如果
-
不是一個好的分隔符(例如,如果第一個斜杠之前的字元串有時不包含破折號,則不會是),則僅用/
作分隔符,將第三個斜杠分隔的欄位拆分為-
,並在前面添加結果的第二位到該行:$ awk -F / '{ split($3,a,"-"); printf "%s %s\n", a[2], $0 }' file YYY >hCoV-19/xxx/xxx-YYY/xxx ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
使用
sed
:$ sed 's/.*-\([^/]*\).*/\1 &/' file YYY >hCoV-19/xxx/xxx-YYY/xxx ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
或者,如果您在 Plan9 上或使用在括號內的表達式
sed
存在問題的 Plan9 實現,/
請為命令使用一組替代分隔符s///
:$ sed 's,.*-\([^/]*\).*,\1 &,' file YYY >hCoV-19/xxx/xxx-YYY/xxx ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
此處使用的正則表達式擷取在該行
/
最後一個字元之後不包含任何字元的子字元串-
。然後它在該行前面加上這個擷取的子字元串和一個空格。
sed
請注意,此解決方案與awk
更進一步的解決方案的主要區別在於awk
程式碼使用了每一行的類欄位結構,而sed
程式碼更“草率”,只是在破折號後尋找一串非斜杠字元。該
https://regexr.com/
站點目前支持 JavaScript 正則表達式和 Perl 兼容的正則表達式 (PCRE)。您在這裡沒有使用這兩種語言中的任何一種,因此無論網站告訴您什麼,您都可能無法正常工作。awk
正在使用 POSIX 擴展正則表達式 (ERE),而大多數其他用於文本操作的標準 Unix 工具,包括sed
使用 POSIX 基本正則表達式 (BRE)。