从linux中的分隔文件中删除一列

时间:2012-10-03 20:29:01

标签: linux unix awk sed

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

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

7 个答案:

答案 0 :(得分:18)

您只需使用cut

cut -d'|' -f1-2,4- file

答案 1 :(得分:4)

这可能适合你(GNU sed):

sed 's/[^|]*|//3' file

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

这对您的示例非常有用,并且可以根据其他示例进行调整,但实际上并不是通用解决方案。

说明:

-i.bak编辑文件,首先进行名为filename.bak的备份。

\(^.*|.*|\)从该行的开头,匹配所有内容,包括第二个分隔符。括号组匹配(组1)。

.*|匹配所有内容,包括最后一个分隔符。

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

\1\2将所有以前的匹配替换为组1和组2中的文本。

答案 4 :(得分:0)

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

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

只需在$3向下后移动字段,然后通过更改NF的值来更改字段数。

答案 5 :(得分:0)

cut命令将有助于实现此目的

 cat filname | cut -d'|' -f1,2,4

答案 6 :(得分:0)

如果您有许多列

,则另一个awk解决方案可能很有用
awk -F'|'  '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file