我有一个用管道分隔的文件。我有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
这将删除最后三列并添加一列空列。
答案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>
并且有效。