删除sed/awk/perl中的最后一个分隔符



给出了一个输入文件,其中的每一行都包含带分隔符的数据,在数据/标头的末尾有额外的分隔符(带或不带外壳(。

在末尾可以包含额外的分隔符(带/不带空格(。

场景1:页眉&数据在末尾包含额外的分隔符

eno|ename|address|
A|B|C|
D|E|F|

场景2:标头在末尾不包含额外的分隔符

eno|ename|address
A|B|C|
D|E|F|

场景3:使用机柜

eno|ename|address|
1|2|"A"|

最终输出必须像一样

场景1:

eno|ename|address
A|B|C
D|E|F

场景2:

eno|ename|address
A|B|C
D|E|F

场景3:

eno|ename|address
1|2|"A"

到目前为止我已经尝试过的解决方案。但下面的解决方案不适用于所有三种场景——无论如何,我可以用一个命令来支持Sed/Awk/Perl 中的所有三种方案

perl -pne 's/(.*)|/$1/' filename

请您尝试以下操作。

awk '{gsub(/|$|| +$/,"")} 1'  Input_file

说明:

CCD_ 1是全局替换具有上述值的匹配模式的CCD_ 2函数。

正则表达式的解释:

/|$|| +$/:这里有regex的两个部分。第一个是/|$,第二个是用|分段的+$,其中第一个正则表达式用于从行的最后一行删除|,第二个子正则表达式最后删除带空格的|。因此,它基本上成功地解决了这两种情况。

perl -lpe 's/|s*$//' file

这只会删除每行末尾带有可选空格的管道。注意$线锚。

我添加了gsub0,因为s///命令将删除每一行的换行符,-l将把它放回原处。

您所需要的只是:

sed 's/|$//'

更通用一些。假设您有同样的问题,但在不同的文件中使用不同的字段分隔符。这些字段分隔符中的一些是正则表达式(例如空格序列(,另一些只是单个字符c。有了一个小小的awk程序,你就可以走得更远:

# remove_last_empty_field.awk
# 1. Get the correct `fs`
BEGIN { fs=FS; if(length(FS)==1) fs=(FS==" ") ? "[[:blank:]]+" : "["FS"]" }
# remove the empty field
{ sub(fs"$","") }
# Print the current record
1

现在你可以在你的各种文件上运行这个:

$ awk -f remove_last_empty_field.awk f1.txt
$ awk -f remove_last_empty_field.awk FS="|" f2.txt
$ awk -f remove_last_empty_field.awk FS="[|.*]" f3.txt
perl -pi -e 's/|$//' Your_FIle

最新更新