我有一个格式如下的文件:
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
你可以简单地使用cut
.
cut -d'|' -f1-2,4- file
这可能对您有用(GNU sed):
sed 's/[^|]*|//3' file
使用cut
是正确的答案,但如果你真的想使用awk
它比 Kent 显示的更容易:
awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'
只需在$3
down 后将字段洗牌,然后通过更改NF
您的值来更改字段数。
cut 命令将有助于实现这一目标
cat filname | cut -d'|' -f1,2,4
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
这是一个可能的 sed 解决方案:
sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'
这对您的示例非常有用,并且可以针对其他示例进行调整,但并不是真正的通用解决方案。
解释:
-i.bak
就地编辑文件,首先制作一个名为filename.bak
.
\(^.*|.*|\)
从行首开始,匹配直到并包括第二个分隔符的所有内容。括号将此匹配分组(第 1 组)。
.*|
匹配直到并包括最后一个分隔符的所有内容。
\(.*\)
匹配其余和组(第 2 组)。
\1\2
用第 1 组和第 2 组中的文本替换所有先前的匹配项。
如果您有很多列,另一种awk
解决方案可能会很有用
awk -F'|' '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file