从文件中的字符串中删除特定字符串

时间:2015-04-26 09:17:12

标签: string bash awk

我想删除分号分隔文件中所有字符串中的特定字段。

该文件如下所示: -

texta1;texta2;texta3;texta4;texta5;texta6;texta7
textb1;textb2;textb3;textb4;textb5;textb6;textb7
textc1;textc2;textc3;textc4;textc5;textc6;textc7

我想从文件中的所有字符串中删除位置2,5和7。

期望的输出: -

texta1;texta3;texta4;texta6
textb1;textb3;textb4;textb6
textc1;textc3;textc4;textc6

我正在尝试使用' awk'来编写一个小的shell脚本。但代码没有按预期工作。我仍然看到中间的分号和&最后没有被删除。

(注意 - 我能够用' sed'但我的文件有几十万个记录,而且sed代码需要花费很多时间)

你能提供一些帮助吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

最简单的是使用cut

cut -d \; -f 1,3-4,6,8- filename

cut -d \; -f 2,5,7 --complement filename

我认为--complement是特定于GNU的。对于只有七列的文件,第一个示例中的8-实际上不是必需的;它将包括来自第八前进的所有列,如果它们存在的话。我把它包括在内是因为它不会造成伤害并为问题提供更通用的解决方案。

答案 1 :(得分:0)

我通过@Wintermute投了答案,但是如果您无法使用cut --complement或者您坚持使用awk,那么您可以这样做:

awk -v scols=2,5,7 'BEGIN{FS=";"; OFS=";"} {
 split(scols,acols,","); for(i in acols) $acols[i]=""; gsub(";;", ";"); print}' tmp.txt