根据列内容将文本文件拆分为多个文件

根据列内容将文本文件拆分为多个文件

我有一个如下所示的文件:

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

相关内容