我有一个以下格式的文件:
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
答案 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