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

Jas*_*ala 5 command-line text-processing

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

该文件应该包含由竖线 ( |) 分隔符分隔的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
Run Code Online (Sandbox Code Playgroud)

我期待输出为

field1|field2|field3||||||field9
1a|DAVIDJOY|02022|4|5|6|7|8|9
1b|DAVIDJOYZYN|2022|4|5|6|7|8|9
Run Code Online (Sandbox Code Playgroud)

如何使用 shell 级工具执行此操作?

Sté*_*las 14

使用 GNU sed,您可以使用:

sed ':1;s/|/|/9;T;s/|//2;t1'
Run Code Online (Sandbox Code Playgroud)

它将第二个字段与第三个字段连接起来(删除第二次出现的|),根据需要多次,直到输出中的字段不超过 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
Run Code Online (Sandbox Code Playgroud)

它给:

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
Run Code Online (Sandbox Code Playgroud)

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

perl -F'[|]' -lae 'BEGIN {$" = ""; $, = "|"}
                   print $F[0], "@F[1..$#F-7]", @F[-7..-1]'
Run Code Online (Sandbox Code Playgroud)


xen*_*oid 0

您实际上正在寻找第二个和第三个字段,因此如果文件中只有一行:

IFS='|' read _ f1 f2 _ < file
field="$f1 $f2"
Run Code Online (Sandbox Code Playgroud)

  • 十请改变你的问题来说明这一点。就目前情况而言,它表明在受追捧的领域中有一个管道(必要时使用复数) (3认同)