在某个模式之后删除单个列中的所有内容

时间:2016-08-02 18:46:32

标签: shell awk replace sed

我有以下几行

library(dplyr)
library(tidyr)
df1 %>% 
   group_by(user_id) %>%
   mutate(id = paste0("pred_", row_number()), 
          id = factor(id, levels = paste0("pred_", 1:4))) %>%
   spread(id, pred, drop=FALSE, fill = "")

我想从第一列中删除-Dup并保留其余列,以便我有

ABC-Dup2  XUAS  BSNMM
CVD  nbvn  nbmsb
SVDB-Dup4  NBV  KJHA
TTS-Dup7  MNMN  NBA

我正在尝试sed&#39s / -Dup。* // 1'但它也从该行中删除了其余的列。

4 个答案:

答案 0 :(得分:3)

如果您将.*更改为[^[:blank:]]*,那么您将不再遇到此问题,但仍然存在从 中删除-Dup的问题在线,而不仅仅是第一列。只需使用awk:

awk '{sub(/-Dup.*/,"",$1)}1' file

注意如何对第一列(字段)进行操作:

$ cat file
ABC-Dup2  XUAS  BSNMM
CVD  nbvn-Dup7  nbmsb
SVDB-Dup4  NBV  KJHA
TTS-Dup7  MNMN  NBA

$ awk '{sub(/-Dup.*/,"",$1)}1' file
ABC XUAS BSNMM
CVD  nbvn-Dup7  nbmsb
SVDB NBV KJHA
TTS MNMN NBA

答案 1 :(得分:1)

sed解决方案需要合并字段分隔符以将目标定义为仅第一列。 GNU sed

$ sed -r 's/^(\S*)-Dup\S*/\1/' file

ABC  XUAS  BSNMM
CVD  nbvn  nbmsb
SVDB  NBV  KJHA
TTS  MNMN  NBA

答案 2 :(得分:0)

如果模式是-Dup后跟一个数字,那么你可以尝试像

这样的东西

sed 's/-Dup[0-9]*//1'

答案 3 :(得分:0)

sed 's/\(^[^ ]*\)-Dup[0-9]*/\1/'