【问题标题】:Delete the last character in a specific column in unix删除unix中特定列中的最后一个字符
【发布时间】:2018-01-31 09:35:14
【问题描述】:

我有一个 | 分隔文件,格式如下

U|0|1|10.95|10.95|0|0|0|0| |0| |0| |N|N| |N| |10335790_|1| | |Y|N/A|   
V|0|1|12.65|12.65|0|0|0|0| |0| |0| |N|N| |N| |10335790#|1| | |Y|N/A|   
P|0|1|15.57|15.57|0|0|0|0| |0| |0| |N|N| |N| |10335790!|1| | |Y|N/A|   

我需要删除所有记录的第 20 列的最后一个字符。
“_,#,!”在这种情况下。

预期输出:

U|0|1|10.95|10.95|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A|   
V|0|1|12.65|12.65|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A|   
P|0|1|15.57|15.57|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A|   

如何使用 sed 或 awk 或任何 unix 命令来做到这一点。请注意,这不是一个固定长度的文件,记录的大小可能会有所不同。

【问题讨论】:

    标签: unix awk sed


    【解决方案1】:

    Awk解决方案:

    awk 'BEGIN{ FS=OFS="|" }{ sub(/.$/, "", $20) }1' file
    
    • .$ - 其中. 是字符串$ 末尾的任何字符

    输出:

    U|0|1|10.95|10.95|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A|
    V|0|1|12.65|12.65|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A|
    P|0|1|15.57|15.57|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A|
    

    要执行更具体的替换以应用替换:sub(/[_#!]$/, "", $20)

    【讨论】:

    【解决方案2】:

    如果您想始终删除第 20 个字段中的最后一个字符,那么以下内容可能对您有所帮助。

    awk -F"|" '{$20=substr($20,1,length($20)-1)} 1' OFS="|"  Input_file
    

    【讨论】:

      【解决方案3】:

      使用 sed

      sed -E 's/(([^|]*\|){19}[^_#!]*)[#!_](|.*)/\1\3/' infile
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多