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

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命令来做到这一点。请注意,这不是固定长度的文件,记录的大小可能会有所不同。

最佳答案

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)

    07-26 05:55