删除unix中特定列中的最后一个字符

时间:2018-01-31 09:35:15

标签: unix awk sed

我有以下格式的 | 分隔文件

print_r($_SESSION);

我需要删除所有记录的第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命令执行此操作。请注意,这不是固定长度的文件,记录的大小可能会有所不同。

3 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

使用sed

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