我有一个如下所示的文件:
1 : Aa|xxx Aa|xxx Bb|xxx Cc|xxx Cc|xxx Cc|xxx
2 : Cc|xxx Aa|xxx Aa|xxx Aa|xxx Bb|xxx
3 : Bb|xxx Bb|xxx Aa|xxx Cc|xxx
4 : Bb|xxx Aa|xxx Cc|xxx
5 : Aa|xxx Cc|xxx Bb|xxx
代表xxx
单独的代码,Aa
例如名称。每行始终具有所有三个名称。
我想要三个包含行号(第一列)和仅一个名称的文件。像这样的东西:
1 : Aa|xxx Aa|xxx
2 : Aa|xxx Aa|xxx Aa|xxx
3 : Aa|xxx
4 : Aa|xxx
5 : Aa|xxx
有人可以帮我解决这个问题吗?我会非常高兴。先感谢您!
答案1
一种可能的方法是删除多余的内容:
perl -pe 's/ (Bb|Cc)\S*//g' file > A
perl -pe 's/ (Aa|Cc)\S*//g' file > B
perl -pe 's/ (Aa|Bb)\S*//g' file > C
(有些可以用 sed、awk、ex 完成)
答案2
sed
正如@JJao 所指出的,使用扩展的正则表达式 ( )也很容易-r
:
$ sed -r 's/\s(Cc|Bb)\|...//g' file > A
$ sed -r 's/\s(Aa|Cc)\|...//g' file > B
$ sed -r 's/\s(Aa|Bb)\|...//g' file > C
对于 Os X(在 Apple 系统上),该选项的-r
含义与 GNU 不同sed
。特别是它不能\s
正确解释为空格。相反,请使用:[[:space:]]
。
如果管道后面的名称“xxx”并不总是 3 个字母数字字符,请...
在正则表达式中替换为[^[:space:]]+
。匹配名称的截止点将是第一个遇到的空格。
因此,更一般的答案sed
是针对输出文件 A:
$ sed -r 's/[[:space:]](Cc|Bb)\|[^[:space:]]+//g' file > A