在linux中从分隔文件中删除列

hmtdttj4  于 2023-06-21  发布在  Linux
关注(0)|答案(7)|浏览(103)

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

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

我想删除col 3(分隔符为“|“)从头部和数据中。可以用awk/sed来实现吗?
请注意,第3列中的数据可能为空(第2行)。
输出应为:

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

我试过:

awk -F"|" '{ OFS="|"; $3=""; print }' in.txt > out.txt

但“|”被排除在外。我喜欢“|“然后数据就消失了

uqjltbpv

uqjltbpv1#

你可以使用cut

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

dgsult0t2#

这可能对你有用(GNU sed或cut):

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

备选方案:

cut -f3 -d'|' --co file

注意:--co--complement的缩写,当删除最后一个字段时,该剪切也有效。

0g0grzrc

0g0grzrc3#

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
knpiaxh1

knpiaxh14#

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

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

这对您的示例非常有用,并且可以针对其他示例进行调整,但这并不是一个通用的解决方案。
说明:
-i.bak在适当的位置编辑文件,首先创建一个名为filename.bak的备份。
\(^.*|.*|\)从行的开头开始,匹配第二个分隔符(包括第二个分隔符)。括号将此比赛分组(组1)。
.*|匹配所有内容,直到并包括最后一个分隔符。
\(.*\)匹配其余部分和组(组2)。
\1\2用组1和组2中的文本替换所有先前匹配项。

bpsygsoo

bpsygsoo5#

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

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

只需将$3之后的字段向下混洗,然后通过更改NF的值来更改字段的数量。

ncecgwcz

ncecgwcz6#

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

awk -F'|'  '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file
zynd9foi

zynd9foi7#

cut命令将有助于实现这一点

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

相关问题