我有一個看起來像這樣的檔案:
XXXXXXX-000-387-159 <50空null_27 KCNQ1 1 1.430 0.773 0.656 1.724
XXXXXXX-000-375-285 <50 <50 100 - 500_0 KCNQ1 2 1.409 0.786 0.623 1.801
XXXXXXX-000-523-531 50 - 100 50 - 100 100 - 500_31 KCNQ1 3 1.326 0.848 0.479 1.557
我需要洗掉 KCNQ1 中前 19 個字符之后和字母 K 之前的任何內容(空格和字符)。預期輸出將是:
xxxxxxx-000-387-159 KCNQ1 1 1.430 0.773 0.656 1.724
xxxxxxx-000-375-285 KCNQ1 2 1.409 0.786 0.623 1.801
xxxxxxx-000-523-531 KCNQ1 3 1.326 0.848 0.479 1.557
我試過 sed:
sed -e ’s/...................KCNQ/ KCNQ/g’ file.rpt > file_new.rpt
但它只是改變了第一行。
我究竟做錯了什么?
uj5u.com熱心網友回復:
假設K前 19 個字符和 之間沒有KCNQ,您可以使用
sed -E 's/^(.{19})[^K]*/\1/' file
# If you need to make sure there is `KCNQ` string on the right:
sed -E 's/^(.{19})[^K]*(KCNQ)/\1 \2/' file
查看在線演示:
#!/bin/bash
s='xxxxxxx-000-387-159 < 50 null null_27 KCNQ1 1 1.430 0.773 0.656 1.724
xxxxxxx-000-375-285 < 50 < 50 100 - 500_0 KCNQ1 2 1.409 0.786 0.623 1.801
xxxxxxx-000-523-531 50 - 100 50 - 100 100 - 500_31 KCNQ1 3 1.326 0.848 0.479 1.557'
sed -E 's/^(.{19})[^K]*(KCNQ)/\1 \2/' <<< "$s"
輸出:
xxxxxxx-000-387-159 KCNQ1 1 1.430 0.773 0.656 1.724
xxxxxxx-000-375-285 KCNQ1 2 1.409 0.786 0.623 1.801
xxxxxxx-000-523-531 KCNQ1 3 1.326 0.848 0.479 1.557
此外,如果KCNQ字串中只有一個,您也可以使用
sed -E 's/^(.{19}).*(KCNQ)/\1 \2/' file
where[^K]*替換為.*.
uj5u.com熱心網友回復:
awk使用您顯示的示例將非常簡單,請嘗試以下代碼。
awk '{print substr($0,1,18),substr($0,index($0,"K"))}' Input_file
解釋:簡單的解釋是,在每一行列印子字串。現在子字串基于OP的要求(我們需要從哪個位置列印到哪個位置)。首先在當前行中列印第 1 到 18 個字符,然后獲取索引(K字母的位置值)并從該位置開始列印到此代碼中每個當前行的最后一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349463.html
