修复错误生成的文件中的字段

修复错误生成的文件中的字段

我有一个尚未正确创建的文本文件。我试图让创建文本文件的人修复他们的输出,但这是一个漫长的过程,同时我想尝试修复我所拥有的内容,作为临时解决方法。

该文件应该包含 9 个由竖线 ( |) 分隔符分隔的字段。不幸的是,第二个字段是由竖线分隔的几个字段。并且没有使用转义或引用。所以我拥有的字段远不止9个。

我想修复此问题,方法是按原样采用第一个字段和最后 7 个字段,并将中间的字段转换为单个字段,或者抑制分隔符或用空格替换它们。

举些例子:

field1|field2|field3||||||field9
1a|DAVID|JOY|02022|4|5|6|7|8|9
1b|DAVID|JOY|ZYN|02022|4|5|6|7|8|9

我期望输出为

field1|field2|field3||||||field9
1a|DAVIDJOY|02022|4|5|6|7|8|9
1b|DAVIDJOYZYN|2022|4|5|6|7|8|9

如何使用 shell 级工具来做到这一点?

答案1

使用 GNU sed,您可以使用:

sed ':1;s/|/|/9;T;s/|//2;t1'

它将根据需要多次连接第二个字段和第三个字段(删除第二次出现的|),直到输出中的字段不超过 9 个。

在这样的输入上:

1|a|3|4|5|6|7|8|9
1|a|b|3|4|5|6|7|8|9
1|a|b|c|3|4|5|6|7|8|9

它给:

1|a|3|4|5|6|7|8|9
1|ab|3|4|5|6|7|8|9
1|abc|3|4|5|6|7|8|9

在非 GNU 系统上,您可以使用@RakeshSharma 的 POSIXsed变体或者perl改为:

perl -F'[|]' -lae 'BEGIN {$" = ""; $, = "|"}
                   print $F[0], "@F[1..$#F-7]", @F[-7..-1]'

答案2

使用 GNU awk

awk '{ 
   while ( gsub(/\|/, "|") > 8 )
      $0 = gensub(/\|/, "", 2)
}1' file 

使用 Posix sed:

sed -e '
    :a
    s/|/&/9;tb
    b
    :b
    s///2;ta
' file 

答案3

通过使用分隔符解析文件来创建数组:

IFS='|' read -r -a fields thefile

在结束之前连接第 2 到第 8 项:

field=${fields[1]} ;  
i=2 ; 
max=$((${#fields[*]}-8));  
while [[ $i -le $max ]] ; 
do 
    field="$field ${fields[$i]}" ; 
    (( ++i )) ; 
done  ; 
echo $field

答案4

另一种方法来做到这一点,与python

<file python3 -c '
import sys
for line in sys.stdin:
    first, _, rest = line.strip().partition("|")
    rest_fields = rest.rsplit("|", 8)
    print(first, rest_fields[0].replace("|", ""), *rest_fields[1:], sep="|")
'

相关内容