【问题标题】:Removing the trailing delimiters dynamically动态删除尾随分隔符
【发布时间】:2020-03-13 18:35:58
【问题描述】:

我是脚本新手,我需要编写一个脚本来从平面文件的最后一行中删除不需要的分隔符,该文件将动态更改。

EG:

1|AK|1,asd|CHN|TN|IN|600001
2|AK|1,asd|CHN|TN|IN|600001
AK|10-01-2019|2||||

就像这样,存在不同的文件,并且每个文件的行和列都会有所不同。 那么如何在 2 之后仅从最后一行(I,e)中删除尾随管道

感谢和问候,
阿拉文德·库马尔·塞卡

【问题讨论】:

  • 你试过什么?你有什么问题?请向我们展示您的代码。

标签: shell perl


【解决方案1】:

Perl 的 split() 函数的文档是这样说的:

如果 LIMIT 被省略(或等价地为零),则通常将其视为负数,但尾随的空字段被剥离(始终保留空的前导字段)

因此,split() 的默认行为是删除尾随的空字段。然后我们可以使用join() 重新生成原始记录减去任何尾随分隔符。

所以可以这么简单:

# Note that '|' has a special meaning in regexes, so we
# need to escape it, using '\'.
my $output_line = join '|', split /\|/, $input_line;

或者,将其放入一个从STDIN 读取并写入STDOUT 的完整程序中:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

while (<>) {
  chomp;
  say join '|', split /\|/;
}

如果你把它放在一个名为 rmtrailing 的文件中,那么它可以像这样从命令行运行:

$ perl rmtrailing < your_input_file.txt > your_output_file.txt

【讨论】:

    【解决方案2】:

    以下将删除所有行的尾随管道:

    perl -ple's/\|+\z//'
    

    如果您想在除最后一行之外的所有位置保留尾随管道,您可以使用以下命令:

    perl -nle'
       print($prev) if defined($prev);
       $prev = $_;
       END {
          if (defined($prev)) {
             $prev =~ s/\|+\z//;
             print($prev);
          }
       }
    '
    

    Specifying file to process to Perl one-liner

    【讨论】:

      【解决方案3】:

      这个 sed 单线可以完成这项工作:

      sed '$s/|*$//' file
      

      测试:

      kent$  cat f
      a|b
      a|b||||||
      ||||
      foo|bar||||||
      
      kent$  sed '$s/|*$//' f
      a|b
      a|b||||||
      ||||
      foo|bar
      

      你看到只有最后一行被改变了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 2015-04-03
        • 2019-03-16
        • 1970-01-01
        相关资源
        最近更新 更多