首页 > 解决方案 > 如何从管道分隔文件中的特定列中删除前导字符?

问题描述

我有一个像这样的管道分隔文本文件

TEST|F123433|F123433|TEST
TEST|F123434|F123434|TEST
TEST|F123435|F123435|TEST
TEST|F123436|F123436|TEST
TEST|F123437|F123437|TEST

我正在尝试从第 2 列和第 3 列中删除前导“F”。这是预期的输出。

TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST

我尝试使用如下 sed 来执行此操作,但它仅从第 2 列而不是第 3 列中删除了“F”

sed 's/^TEST|F/TEST|/g'

标签: regexawksed

解决方案


使用sed(并且这仅适用于所述示例)您可以全局替换|F|

$ sed -E 's/\|F/\|/g' file

|F您可以使用两个非全局替换来限制(不一定是列号)的前两个实例sed

sed -e 's/\|F/\|/' -e 's/\|F/\|/' file

或者,以 ERE 形式:

$ sed -E 's/^([^|]*)\|F/\1|/; s/([^|]*)\|F/\1|/' file

更好、更灵活的逐字段解决方案awk允许您指定哪一列:

$ awk  'BEGIN{FS=OFS="|"} {for (i=2; i<=3;i++)sub(/^F/,"",$i);}1' file
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST

推荐阅读