我有一个用管道分隔的文件。我有28个字段。我必须删除最后 2 个字段并仅打印 26 个字段

我有一个用管道分隔的文件。我有28个字段。我必须删除最后 2 个字段并仅打印 26 个字段

我有一个用管道分隔的文件。我有28个字段。我必须删除最后 2 个字段并仅打印 26 个字段。

这些是最后 3(26,27,28) 字段DC||0|

我想要的输出是|DC|

答案1

对于任何符合 POSIX 标准的 sed:

sed 's/\([^|]*|\)\{2\}$//'

例如:

$ echo 'foo|DC||0|' | sed 's/\([^|]*|\)\{2\}$//'
foo|DC|

答案2

GNUawk:

awk '{NF=NF-3; NF++}1' FS='|' OFS='|' file

这将删除最后三列并添加一列空列。


看:8 个强大的 awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

答案3

awk 'BEGIN{FS=OFS="|"} NF>2{NF-=2;$1=$1;print}'

对于某些(但不是全部!)awk 变体,您可以省略$1=$1.

如果该行的字段少于 3 个,则根本不会打印该行;这是确保起始字段为空的行与起始字段少于 3 个字段的行之间存在差异的唯一方法。

当字段分隔符 ( FS) 不是单个空格时,它的每个匹配都会分隔字段,并且空的前导字段和尾随字段不会被修剪。

在像 这样的行中DC||0|,有 4 个字段 ( DC, <empty>, 0, ),而不是 3 个。删除最后 2 个字段将在与 联接时<empty>得到DC, <empty>=> 。DC||

类似地,在像 之类的行中|DC|,有 3 个字段(<empty>, DC, <empty>),而不是 1 个,删除最后 2 个字段将导致<empty>,即没有任何 的空行|

答案4

我用过cut -d "|" -f 1-26 <filename>并且有效。

相关内容