给出了一个输入文件,其中的每一行都包含带分隔符的数据,在数据/标头的末尾有额外的分隔符(带或不带外壳(。
在末尾可以包含额外的分隔符(带/不带空格(。
场景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
这只会删除每行末尾带有可选空格的管道。注意$
线锚。
我添加了gsub
0,因为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