我有一个如下格式的文件:
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
但“|”被排除在外。我喜欢“|“然后数据就消失了
uqjltbpv1#
你可以使用cut。
cut
cut -d'|' -f1-2,4- file
dgsult0t2#
这可能对你有用(GNU sed或cut):
sed 's/[^|]*|//3' file
备选方案:
cut -f3 -d'|' --co file
注意:--co是--complement的缩写,当删除最后一个字段时,该剪切也有效。
--co
--complement
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
knpiaxh14#
下面是一个可能的sed解决方案:
sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'
这对您的示例非常有用,并且可以针对其他示例进行调整,但这并不是一个通用的解决方案。说明:-i.bak在适当的位置编辑文件,首先创建一个名为filename.bak的备份。\(^.*|.*|\)从行的开头开始,匹配第二个分隔符(包括第二个分隔符)。括号将此比赛分组(组1)。.*|匹配所有内容,直到并包括最后一个分隔符。\(.*\)匹配其余部分和组(组2)。\1\2用组1和组2中的文本替换所有先前匹配项。
-i.bak
filename.bak
\(^.*|.*|\)
.*|
\(.*\)
\1\2
bpsygsoo5#
使用cut是正确的答案,但如果你真的想使用awk,它比肯特展示的更容易:
awk
awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'
只需将$3之后的字段向下混洗,然后通过更改NF的值来更改字段的数量。
$3
NF
ncecgwcz6#
如果您有许多列,另一个awk解决方案可能很有用
awk -F'|' '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file
zynd9foi7#
cut命令将有助于实现这一点
cat filname | cut -d'|' -f1,2,4
7条答案
按热度按时间uqjltbpv1#
你可以使用
cut
。dgsult0t2#
这可能对你有用(GNU sed或cut):
备选方案:
注意:
--co
是--complement
的缩写,当删除最后一个字段时,该剪切也有效。0g0grzrc3#
应该会给予你输出。
这是非常基本的awk用法。
编辑
你没提到70列:(
试试这个:
knpiaxh14#
下面是一个可能的sed解决方案:
这对您的示例非常有用,并且可以针对其他示例进行调整,但这并不是一个通用的解决方案。
说明:
-i.bak
在适当的位置编辑文件,首先创建一个名为filename.bak
的备份。\(^.*|.*|\)
从行的开头开始,匹配第二个分隔符(包括第二个分隔符)。括号将此比赛分组(组1)。.*|
匹配所有内容,直到并包括最后一个分隔符。\(.*\)
匹配其余部分和组(组2)。\1\2
用组1和组2中的文本替换所有先前匹配项。bpsygsoo5#
使用
cut
是正确的答案,但如果你真的想使用awk
,它比肯特展示的更容易:只需将
$3
之后的字段向下混洗,然后通过更改NF
的值来更改字段的数量。ncecgwcz6#
如果您有许多列,另一个
awk
解决方案可能很有用zynd9foi7#
cut命令将有助于实现这一点