【问题标题】:remove last delimiter in sed/awk/perl删除 sed/awk/perl 中的最后一个分隔符
【发布时间】:2019-10-22 17:24:00
【问题描述】:

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

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

场景 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

【问题讨论】:

  • 使用-p-n 之一,但不能同时使用。
  • @格伦杰克曼。您可以同时使用两者。这简直是​​不必要的,因为使用 -p 会打开 -n

标签: perl awk sed


【解决方案1】:

请您尝试关注一下。

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

解释:

gsubawk 函数,它可以用提到的值全局替换匹配的模式。

正则表达式的解释:

/\|$|\| +$/: 这里有两部分的正则表达式。第一个是/\|$,第二个是+$,它与| 分隔,其中第一个正则表达式用于从最后一行删除|,第二个正则表达式最后删除| 并带有空格。所以它基本上成功地处理了这两种情况。

【讨论】:

  • 这适用于上述场景。我在您的命令中看到三个管道包含 awk '{gsub(/\|$|\| +$/,"")} 1' 。在命令中我怎样才能确定哪个位置是分隔符
  • @user1485267,所以| 当它被\| 转义时,这意味着我们让awk 知道寻找确切的字符| 而当我只提到|表示使用前面提到的正则表达式或使用后面提到的正则表达式,如 OR 条件。如有任何疑问,请让我知道?
  • @user1485267,我已经成功添加了它的解释,请仔细阅读,如有任何疑问,请告知。
  • 感谢Ravinder的详细解释
【解决方案2】:
perl -lpe 's/\|\s*$//' file

会做的。这只会删除管道,然后在每行的末尾添加可选的空格。注意$ 线锚。

我添加了-l,因为每行的换行符都会被s/// 命令删除,-l 会将其放回原处。

【讨论】:

  • perl -pe's/\|\h*$//'
【解决方案3】:

你只需要这个:

sed 's/|$//'

【讨论】:

  • 2019-10-22。一天 sed > awk。
  • 如果有尾随空格则不起作用,我认为他们 OP 说这是可能的。
【解决方案4】:

更通用一点。假设您有同样的问题,但在不同的文件中有不同的字段分隔符。其中一些字段分隔符是正则表达式(例如,一系列空格),其他只是单个字符 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

【讨论】:

    【解决方案5】:
    perl -pi -e 's/\|$//' Your_FIle
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2017-03-26
      • 2013-01-17
      相关资源
      最近更新 更多