Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除unix中特定列中的最后一个字符_Unix_Awk_Sed - Fatal编程技术网

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

删除unix中特定列中的最后一个字符,unix,awk,sed,Unix,Awk,Sed,我有一个|分隔文件,格式如下 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|   
我需要删除所有记录第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命令来实现这一点。请注意,这不是一个固定长度的文件,记录的大小可能会有所不同。

如果您希望始终删除第20个字段中的最后一个字符,则以下内容可能会对您有所帮助

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

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)

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

这很好用,你能在最后解释一下1的用途吗?这是一种很常见的打印每一行的Awk快捷方式。这是我第一次在谷歌上大放异彩: