9

我有一个格式如下的文件:

col1|col2|col3|col4
a|b|c|d
e|f||h
i|j|k|l

我想从标题和数据中删除 col3(带有分隔符“|”)。这可以使用 awk/sed 完成吗?

请注意 col3 中的数据可能为空(第 2 行)。

输出应该是:

col1|col2|col4
a|b|d
e|f|h
i|j|l
4

7 回答 7

21

你可以简单地使用cut.

cut -d'|' -f1-2,4- file
于 2012-10-03T20:49:01.677 回答
4

这可能对您有用(GNU sed):

sed 's/[^|]*|//3' file
于 2012-10-03T22:28:59.937 回答
0

使用cut是正确的答案,但如果你真的想使用awk它比 Kent 显示的更容易:

awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'

只需在$3down 后将字段洗牌,然后通过更改NF您的值来更改字段数。

于 2012-10-03T21:25:12.110 回答
0

cut 命令将有助于实现这一目标

 cat filname | cut -d'|' -f1,2,4
于 2014-07-04T11:49:49.527 回答
0
awk  'BEGIN{FS=OFS="|"}{print $1,$2,$4}'   file

应该给你输出。

这是非常基本的 awk 用法。

编辑

你没有提到 70 列... :(

尝试这个:

awk  -F'|' '{s="";for(i=1;i<=NF;i++){f=(NF==i)?"":FS;if(i!=3)s=s $i f;}print s}' file
于 2012-10-03T20:42:29.133 回答
0

这是一个可能的 sed 解决方案:

sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'

这对您的示例非常有用,并且可以针对其他示例进行调整,但并不是真正的通用解决方案。

解释:

-i.bak就地编辑文件,首先制作一个名为filename.bak.

\(^.*|.*|\)从行首开始,匹配直到并包括第二个分隔符的所有内容。括号将此匹配分组(第 1 组)。

.*|匹配直到并包括最后一个分隔符的所有内容。

\(.*\)匹配其余和组(第 2 组)。

\1\2用第 1 组和第 2 组中的文本替换所有先前的匹配项。

于 2012-10-03T21:04:12.747 回答
0

如果您有很多列,另一种awk解决方案可能会很有用

awk -F'|'  '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file
于 2016-11-01T08:40:41.107 回答