【问题标题】:Remove everything in a pipe delimited file after second-to-last pipe在倒数第二个管道之后删除管道分隔文件中的所有内容
【发布时间】:2016-12-14 18:45:59
【问题描述】:

如何在倒数第二个管道之后删除管道分隔文件中的所有内容?喜欢这条线

David|3456|ACCOUNT|MALFUNCTION|CANON|456

结果应该是

David|3456|ACCOUNT|MALFUNCTION

【问题讨论】:

    标签: bash shell unix ksh


    【解决方案1】:

    在每行末尾替换|(string without pipe)|(string without pipe)

    sed 's/|[^|]*|[^|]*$//' inputfile
    

    【讨论】:

      【解决方案2】:

      使用awk,类似

      awk -F'|' 'BEGIN{OFS="|"}{NF=NF-2; print}' inputfile
      David|3456|ACCOUNT|MALFUNCTION
      

      (或)如果您知道总列数,则使用cut,即6 -> 4

      cut -d'|' -f -4 inputfile
      David|3456|ACCOUNT|MALFUNCTION
      

      【讨论】:

      • 不工作。按原样打印整个文件。我在这里有什么遗漏吗?尝试为 awk -F'|' '开始{OFS="|"}{NF=NF-2;打印}' /home/user/file.txt
      • 您是否在cygwin 下的Windows 机器上?您使用的是哪个 Linux 和哪个awk 版本?你能输出awk --version 吗?和which awk
      • @Satya:在运行awk 命令之前,你能做到dos2unix < /home/user/file.txt 吗?
      • one-true-awk (AKA nawk) 不会重新评估记录,直到对其字段之一进行分配。以下将按预期工作:{NF-=2;$1=$1}1
      【解决方案3】:

      我会使用的命令是

      cat input.txt | sed -r 's/(.*)\|.*/\1/' > output.txt
      

      【讨论】:

      • 您想要移除 2 个管道。你不应该使用\|[^|]*\|[\|]*$ 吗?
      【解决方案4】:

      纯 Bash 解决方案:

      while IFS= read -r line || [[ -n $line ]] ; do
          printf '%s\n' "${line%|*|*}"
      done <inputfile
      

      有关while 循环如何工作的详细信息,请参阅Reading input files by line using read command in shell scripting skips last line(尤其是answer by Jahid)。

      有关${line%|*|*} 的信息,请参阅pattern matching in Bash

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-25
        • 2016-01-08
        • 1970-01-01
        相关资源
        最近更新 更多