使用sed或awk

时间:2016-10-06 23:26:37

标签: bash unix awk sed

我有一个文本文件A.txt,其中所有行都有由管道|分隔符分隔的相同数量的字段。我需要将,替换为|,以获取每行最后一个分隔符后的数据。

示例:

1,2|3,4|5|6,7,8
1,8|4|6,5,3|4,5

所需的输出,(仅在最后一个分隔符后用,替换|):

1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5

如何使用sedawk

实现此目标

2 个答案:

答案 0 :(得分:3)

使用awk

awk 'BEGIN{FS=OFS="|"} gsub(",", "|", $NF)'
  • BEGIN{FS=OFS="|"}将输入和输出字段分隔符设置为文字|

  • gsub(",", "|", $NF)将所有gsub(),替换为最后一个字段中的| {/ 1}}

示例:

$NF

答案 1 :(得分:1)

$ cat ip.txt 
1,2|3,4|5|6,7,8
1,8|4|6,5,3|4,5

sed

$ sed -E ':a s/^(.*\|[^,]+),([^|]+)$/\1|\2/g; ta' ip.txt 
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
  • :ata循环sed命令,直到找到匹配项
  • ^(.*\|[^,]+)从行首到|后跟非,个字符。 *+将尝试尽可能匹配
  • ,匹配逗号
  • 在逗号之后
  • ([^|]+)$,在行尾之前不应该有任何|个字符


perl

$ perl -F'\|' -lane '$F[-1] =~ tr/,/|/; print join "|",@F' ip.txt 
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
  • -F'\|'|上拆分输入行并保存到@F数组
  • $F[-1] =~ tr/,/|/;代表数组的最后一个元素,将所有,替换为|
  • print join "|",@F打印修改后的@F数组,其中|为分隔符

对于一些正则表达式的魔法:

$ perl -pe 's/.*\|(*SKIP)(*F)|,/|/g' ip.txt
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
  • .*\|(*SKIP)(*F)跳过该模式,直至上一个|
  • 然后将所有,替换为|