Text-Processing

如何添加基於正則表達式的列

  • March 23, 2021

我有一個文件 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)。

另請參閱為什麼我的正則表達式在 X 中有效,但在 Y 中無效?

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